UICachedDeviceWhiteColor и NSAutoRelease для утечек памяти в ячейках таблицы - PullRequest
0 голосов
/ 05 марта 2009

У меня есть утечка памяти, которая отображает UICachedDeviceWhiteColor. Я нигде не использую UICachedDeviceWhiteColor, и поиск по нему обнаруживает людей, которые говорят, что это ошибка в iPhone-SDK. Я нашел эту запись в блоге: http://piezoelectrics.blogspot.com/2009/02/uicacheddevicewhitecolor-leak-in-iphone.html

но я не могу найти

#import "NSAutoreleasePool.h"  

Я получаю сообщение об ошибке: NSAutoReleasePool.h: нет такого файла или каталога. Есть ли исправление этой утечки памяти или правильный способ выделения ячеек таблицы из перьев?

Вот как я сейчас это делаю:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {   

UITableViewCell *cell = nil;    
cell = [tableView dequeueReusableCellWithIdentifier:@"CellNameIdentifier"];

if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"CellName" owner:self options:nil];
//cellName is IBOutlet to XIB's tablecell.  I reference it several times in this calss
cell = cellName; 
}

return cell;

}

Я не вижу выделение здесь, так почему бы не утечка памяти? Может ли это быть проблемой:

@property (nonatomic, retain) IBOutlet UITableViewCell *cellName;

Ответы [ 2 ]

1 голос
/ 06 марта 2009

На самом деле, если вы используете NIB для своей ячейки табличного представления (обычно это не требуется, если вы не делаете что-то действительно нестандартное), вам придется загружать его каждый раз, когда вы не получаете попадания в многоразовое табличное представление. клетка. Я думаю, что следующий код выглядит немного чище:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyID"];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CellName"
                    owner:self options:nil];
    cell = [nib objectAtIndex:1];
}

Трюк objectAtIndex: 1 работает, если ячейка является первым объектом в NIB (нулевой объект - владелец файла).

Некоторые примечания для выполнения ячеек табличного представления:

  • Не сохраняйте объекты ячейки неявным образом, присваивая свойство или вручную. Это приведет к неправильной работе функции многократно используемой ячейки таблицы, поскольку она не может освободить память ячейки.
  • Не забудьте установить идентификатор повторного использования ячейки в конструкторе интерфейса, поскольку вы не можете сделать это в коде, если используете NIB.
  • Всегда проверяйте, чтобы ячейка была автоматически освобождена. Либо сделайте это вручную, либо убедитесь, что вы используете функцию какао, которая возвращает автоматически освобожденную память (как это делает метод objectAtIndex:).
1 голос
/ 05 марта 2009

Из-за объявления вашего свойства установщик sythesized для вашего свойства cellName сохранит переданный ему объект.

Вы должны отправить сообщение об освобождении на cellName в вашем методе dealloc.

Кроме того, нет необходимости загружать перо каждый раз, когда запрашивается cellView. Либо проверьте, если cellName! = Nil, и верните его, либо установите reuseIdentifier для cellView, чтобы его можно было найти с помощью dequeueReusableCellWithIdentifier.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...