Настройка пользовательского фона UITableViewCell в формате png

#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];