#iphone #objective-c
#iPhone #objective-c
Вопрос:
Я создаю пользовательский класс cell, в котором я помещаю различные типы вложенных представлений в свой метод инициализации, но с фреймом как CGRectZero.
self.subTitleLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];[self.contentView addSubview:self.subTitleLabel];
self.scannedProductLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.scannedProductLabel];
self.requestStatusLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview:self.requestStatusLabel];
В моем методе layoutSubviews я использую эти метки в зависимости от моих потребностей. Например, для одного типа ячеек я буду использовать первую метку, а для другого типа — другую метку.
if ([self.cellType isEqualToString:@"CustomerDetails"] ) {
//self.productImageView.frame = CGRectMake(aContentRect.origin.x kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/4));
self.titleLabel.frame = CGRectMake(aContentRect.origin.x kCellOffset, 0.0f, aTitleCellWidth , floorf(aHeight/2));
self.subTitleLabel.frame = CGRectMake(aContentRect.origin.x kCellOffset, floorf(aHeight/2), aTitleCellWidth, floorf(aHeight/4));
self.requestStatusLabel.frame = CGRectMake(aContentRect.origin.x kCellOffset, floorf((aHeight/2) (aHeight/4)), aTitleCellWidth , floorf(aHeight/4));
}
Мой вопрос в том, что это хорошая идея сделать это с точки зрения памяти. Как будто моя цель решена, но мой пользовательский объект cell содержит вложенные представления, которые находятся в памяти, но не видны. Если да, то каков альтернативный подход для такого сценария.
Ответ №1:
Если не все вложенные представления будут использоваться для каждого типа ячейки, я предлагаю лениво создавать каждое вложенное представление при первом обращении к нему. Это может быть достигнуто путем переопределения его средства получения следующим образом:
- (UILabel)subTitleLabel {
if (subTitleLabel == nil) {
subTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(kSubTitleX, kSubTitleY, kSubTitleWidth, kSubTitleHeight)];
[self.contentView addSubview:subTitleLabel];
}
return subTitleLabel;
}
Таким образом, subTitleLabel
создается и добавляется в представление содержимого при первом обращении к нему через средство получения. Если вы никогда не вызываете средство получения, например, потому что тип ячейки этого не требует, оно self.subTitleLabel
никогда не будет вызвано и subTitleLabel
никогда не будет создано.
Ответ №2:
Я бы не подумал, что проблемы с памятью здесь будут такой большой проблемой. Если вы правильно повторно используете ячейки, то вы, вероятно, создаете только 5-10 ячеек в своем списке, которые постоянно перерабатываются.
Хотя одним из альтернативных решений было бы использовать celltype в качестве идентификатора повторного использования и создавать только те подвиды, которые необходимы для этого типа. Таким образом, когда вы получаете ячейку для определенного типа, вы знаете, что в ней будут только обязательные поля. Это может привести к созданию большего количества ячеек, которые на самом деле могут занимать больше памяти.