为什么在返回之前未发布此NIB视图?

时间:2010-07-31 14:04:37

标签: objective-c memory-management autorelease

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];
if (cell == nil) 
    {
    [[NSBundle mainBundle] loadNibNamed:@"ThemeCell" owner:self options:nil];
        cell = self.themeCell;
        self.themeCell = nil;
}
...
return cell;

我的理解是self.themeCell = nil;应该销毁该对象,因为它不再拥有它。 cell = self.themeCell不保留它,但只是分配它。那么是什么让细胞保持活力?我只能假设合成属性是自动释放旧值而不是立即释放它。是这种情况吗?

2 个答案:

答案 0 :(得分:2)

nib加载过程稍微(但不是非常)复杂,并且在OSX和iPhone平台之间有所不同。您可以在资源编程指南的the Nib Object Life Cycle部分中阅读此内容。在表1-1中,您将找到:

  

创建nib文件中的对象   保留计数为1然后   自动释放。因为它重建了   然而,对象层次结构,UIKit   重新建立之间的联系   使用setValue的对象:forKey:   方法,它使用可用的   setter方法或保留对象   如果没有setter方法,则为default   可用

所以会发生的是,单元格的保留计数为1,然后在使用合成的setter设置时,它会增加到2.当您将属性设置为nil时,保留计数下降到1,单元格返回到表格视图。表视图将其添加到其视图层次结构中,从而保留它(并且可能还将其保留在其逻辑的其他部分中)。毕竟,autorelease池已耗尽。

  

我只能假设是同步的   财产是自动释放旧的   值而不是释放,是这个   情况?

不,合成的setter立即释放对象。 (尽管某些框架类可能会持续一段时间,如果它是一个需要动画的视图,例如。)

答案 1 :(得分:0)

AFAIK,合成属性使用release,而非autorelease

可能是单元格在NIB中指定了一个委托或者这样保留所有权,或者loadNibNamed:owner:options:调用中的某些内容在仍然未决的对象上设置自动释放。在NSLog(@"Retain Count: %d", [cell retainCount]);之前和之后加self.themeCell=nil;进行验证。