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
不保留它,但只是分配它。那么是什么让细胞保持活力?我只能假设合成属性是自动释放旧值而不是立即释放它。是这种情况吗?
答案 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;
进行验证。