#iphone #memory #uitableview #memory-management
#iPhone #память #uitableview #управление памятью
Вопрос:
Я меняю фон UITableViewCellStyleSubtitle следующим образом :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"bgCellNormal" ofType:@"png"];
cell.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:imagePath]] autorelease];
[...]
return cell;
}
Мне интересно, есть ли лучший способ сделать это без использования такого количества выделений и автоматического освобождения?
Моя цель — оптимизировать память в этих uitableview!
Спасибо за вашу помощь!
Херауд
Ответ №1:
Вы не должны получать доступ или устанавливать backgroundView
свойство из tableView:cellForRowAtIndexPath:
. Возможно, фреймворк еще не создал его экземпляр и может заменить его у вас под ногами. Сгруппированные и простые табличные представления ведут себя по-разному в этом отношении, как и любой новый стиль в будущем.
Фоновый вид должен быть установлен и / или настроен в tableView:willDisplayCell:forRowAtIndexPath:
. Этот метод вызывается непосредственно перед тем, как вызов должен быть отображен в первый раз. Вы можете использовать его для полной замены фона, если хотите. Обычно я делаю что-то вроде этого:
-(void) tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath;
{
static UIImage* bgImage = nil;
if (bgImage == nil) {
bgImage = [[UIImage imageNamed:@"myimage.png"] retain];
}
cell.backgroundView = [[[UIImageView alloc] initWithImage:bgImage] autorelease];
}
Ответ №2:
Если вы используете reuseIdentifier для повторного использования ячейки, то на самом деле вы не будете выделять память так много раз.
Кроме того, если ваш png-файл добавлен в ваш проект, вы можете вместо этого вызвать [UIImage imageNamed:@»bgCellNormal.png».
Функция UIImage imageNamed кэширует изображение для обеспечения оптимизации.
Ответ №3:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]
UIImageView *bgImage = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgCellNormal.png"]];
cell.backgroundView = bgImage;
bgImage release];
[...]
return cell;
}
Ответ №4:
вы можете использовать файл nib для установки фонового изображения ячейки, унаследовав класс UITableView Cell.
В противном случае вы можете удалить автоматически созданный объект с помощью
UIImageView *imageView = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgCellNormal.png"];
cell. backgroundView = imageView;
[imageView release];