Objective C Утечки при освобождении объектов с UITableViewCell - PullRequest
1 голос
/ 25 августа 2009

Я выполняю следующий код в tableView: cellForRowAtIndexPath:

File *file = [[File alloc] init];
file = [self.fileList objectAtIndex:row];
UIImage* theImage = file.fileIconImage;

cell.imageView.image = theImage;
cell.textLabel.text = file.fileName;
cell.detailTextLabel.text = file.fileModificationDate;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

return cell;

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

File *file = [[File alloc] init];
file = [self.fileList objectAtIndex:row];

UIImage* theImage = file.fileIconImage;

cell.imageView.image = theImage;
cell.textLabel.text = file.fileName;
cell.detailTextLabel.text = file.fileModificationDate;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
[file release];

return cell;

Теперь, когда я запускаю приложение, оно падает. UITableViewCells все еще ссылаются на объект файла? Какой подход использовать здесь, чтобы убедиться, что у меня нет утечки памяти?

Ответы [ 2 ]

6 голосов
/ 25 августа 2009
File *file = [[File alloc] init];
file = [self.fileList objectAtIndex:row];

Ну, здесь вы сначала выделяете новый File, а затем отбрасываете указатель и, очевидно, получаете другой существующий объект из массива. Это тот, который вы отпустите, если позже позвоните release. Тот, кого вы называете release в конце, не тот, который вы выделили. Указатель на вновь выделенный объект теряется и, таким образом, утекает.

Вероятно, сбой, потому что self.fileList содержит указатель на уже разрушенный объект после этого.

Может быть, вы хотели написать просто

File *file = [self.fileList objectAtIndex:row];
1 голос
/ 25 августа 2009

Да, ячейка все еще ссылается на нее в тот момент, когда вы ее освобождаете, поэтому приложение вылетает.

Вам нужно использовать авто-релиз при его объявлении следующим образом:

File *file = [[[File alloc] init] autorelease];

Тогда не вызывайте часть [выпуск файла]. Как только на него больше не ссылаются (то есть, когда вы прекращаете использовать ячейку), оно будет автоматически освобождено в начале следующего цикла выполнения.

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