2
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不保留它,而只是分配它。那么是什么让细胞保持活力呢?我只能假设合成属性是自动释放旧值而不是立即释放它。是这样吗?

4

2 回答 2

2

nib 加载过程稍微(但不是很)复杂,并且在 OSX 和 iPhone 平台之间有所不同。您可以在 Resource Programming Guide的 Nib Object Life Cycle部分中了解这一点。在表 1-1 中,您会发现:

nib 文件中的对象创建时保留计数为 1,然后自动释放。然而,当它重建对象层次结构时,UIKit 使用 setValue:forKey: 方法重新建立对象之间的连接,该方法使用可用的 setter 方法,如果没有可用的 setter 方法,则默认保留对象

那么会发生什么情况是,该单元格的保留计数为 1,然后当它使用您的合成设置器设置时,它增加到 2。当您将您的属性设置nil为保留计数时,该单元格将下降到 1,并且该单元格返回到表视图。表视图将其添加到其视图层次结构中,从而保留它(并且可能在其逻辑的其他部分也保留它)。在这一切之后,autorelease游泳池被排干了。

我只能假设 syntesized 属性是自动释放旧值而不是释放,是这样吗?

不,合成设置器会立即释放对象。(尽管某些框架类可能会保留对象更长的时间,例如,如果它是一个需要动画的视图。)

于 2010-07-31T14:20:20.823 回答
0

AFAIK,综合属性使用release,而不是autorelease

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

于 2010-07-31T14:19:52.723 回答