Пользовательский UITableViewCell, авто-релиз и другой метод - PullRequest
0 голосов
/ 19 марта 2012

(простите за мой английский :-) Я загружаю пользовательский 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;

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

1 Ответ

0 голосов
/ 19 марта 2012

Это не обязательно. Объект не 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
...