Сбой при выпуске изображения в UITableViewCell - PullRequest
0 голосов
/ 17 апреля 2011

Я прохожу учебник по просмотрам таблиц для iPhone. Ниже приведен метод источника данных для заполнения таблицы.

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
    static NSString* SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier] autorelease];
    }
    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    UIImage* image = [UIImage imageNamed:@"face.png"];
    cell.imageView.image = image;
    //[image release];
    return cell;
}

Я заметил, что автор не выпустил изображение после установки его в качестве значка для ячейки таблицы. Исходный код, определяющий UITableCell.imageView.image, фактически показывает, что это сохраняемое свойство. Если я не опубликую свою собственную копию изображения, то в конце метода количество сохранений будет равно 2. Поэтому я решил выпустить его, чтобы освободить память. Тем не менее, это приводит к сбою эмулятора iPhone, когда я слегка удаляю стол с экрана. Почему?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Метод imageNamed: - это удобный метод.Другими словами, ресурс изображения для вас autoreleased.Если вы попытаетесь освободить этот image объект, значит, вы перевыпустили его.

Редактировать: Правило управления памятью следующее: Каждый раз, когда вы вызываете alloc, new, copy или retain, вы должны позвонить release или autorelease.

1 голос
/ 17 апреля 2011

Метод -imageNamed: возвращает автоматически выпущенное изображение. Таким образом, вам не нужно выпускать его самостоятельно.

Строка кода: cell.imageView.image = image; заботится о сохранении изображения, которое необходимо сделать.

Помните, что вы должны вызывать release или autorelease для объекта, только если вы вызвали retain для него или создали его с alloc, или методом со словом «new» или «copy» в нем. Во всех других случаях (при условии, что они все делают правильно, что вы должны предположить, что это так), возвращаемый объект автоматически освобождается.

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