Пользовательский UITableViewCell, autorelease и другой метод

(извините за мой английский :-) Я загружаю пользовательский UITableViewCell:

static NSString *CellIdentifier = @"ReminderCell";
ReminderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSLog(@"Alloco nuova cella");
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:@"ReminderCell" owner:nil options:nil];
    for(id currentObject in objectsInNib)
    {
        if([currentObject isKindOfClass:[ReminderCell class]])
        {
            cell = (ReminderCell *)currentObject;
            break;
        }
    }
} //fine caricamento cella dal Nib

return cell;

Я устанавливаю для владельца значение nil, потому что у меня есть .m и .h для этой ячейки, и я хочу, чтобы выход был внутри собственных файлов, а не в UITableViewController. Работает нормально.

У меня вопрос о правильном управлении памятью в этой ситуации.

Я понимаю, что loadNibNamed возвращает автоматически выпущенный массив. Более того, я понимаю, что пул автозапуска истощается в конце текущего цикла. По этой причине нет необходимости сохранять мою пользовательскую ячейку перед ее возвратом.

Но я много раз слышал, что вы должны предполагать, что автоматически выпущенный объект гарантированно живет только до конца метода, на который был отправлен автозапуск. Предполагая это, я должен немедленно сохранить ячейку, а затем автоматически освободить ее:

cell = [[(ReminderCell *)currentObject] retain];
//code...
[cell autorelease];
return cell;

Это правильно или мне не стоит об этом беспокоиться? Спасибо


person LombaX    schedule 19.03.2012    source источник
comment
Извините, очевидно, что автозапуск должен быть внутри if, сразу после cell = [[(ReminderCell *) currentObject] keep]; в противном случае я мог бы ошибочно высвободить другие ячейки (например, исключенные из очереди)   -  person LombaX    schedule 19.03.2012


Ответы (1)


В этом нет необходимости. Объект не guaranteed to live only until the end of the method where the autorelease was sent - методы здесь не важны. Объект будет освобожден после того, как будет осушен пул автозапуска, в который он был добавлен методом autorelease. Поскольку в вашем методе нет управления пулом с автоматическим выпуском, currentObject не получит release во время выполнения.

Например (без ARC конечно):

id obj;
NSAutoreleasePool *pool = [NSAutoreleasePool new];
...
obj = [other object];
...
[pool drain];

[obj doSomething]; // DANGEROUS

В вашем случае это примерно так:

id obj;
...
obj = [other object];
...
[obj doSomething]; // SAFE
person hoha    schedule 19.03.2012