自定义UITableViewCell,autorelease等方法

时间:2012-03-19 10:21:22

标签: objective-c memory-management uitableview loadnibnamed

(对不起我的英文:-) 我正在加载自定义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 :(得分:0)

这不是必需的。对象不是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