(对不起我的英语:-)我正在加载自定义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;
这是正确的还是我不应该担心?感谢
这不是必须的。对象不是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