子类化的UITableViewCell除非保留,否则会创建僵尸

|| 我已经使用自定义笔尖创建了UITAbleViewCell子类,并在我的应用程序的两个不同的UITableViews中使用它。它可以在其中一个表中完美运行,但是当我大力滚动它时,另一个表会崩溃。仪器通过以下代码(在cellForRowAtIndexPath中)识别僵尸:
NSString *identifier = @\"edit\";
LogTableCell *cell = (LogTableCell*)[tableView dequeueReusableCellWithIdentifier:identifier];

if (!cell) {
   cell = (LogTableCell*) [[[NSBundle mainBundle] loadNibNamed:@\"LogTableCell\" owner:self options:nil] objectAtIndex:0];        
   [cell retain];       // prevents zombies!
}
NSLog(@\"%@: retainCount: %d\", identifier, [cell retainCount]);

// some other cell init stuff

return cell;
注意[单元格保留];行-当它在那里时,代码可以顺畅地工作。取出并崩溃。 NSLog始终报告的keepCount为2,因此它不是必需的。但是,如果我做这样的事情:
   if ([cell retainCount] < 1) { [cell retain]; }       // does not prevent zombies!
它不起作用。没有alloc / init,因此我根本不必进行自动释放或为此担心,我一直认为cellForRowAtIndexPath为我释放了单元格。 当我不使用乐器时,这是我从xcode中得到的错误:
*** -[CALayer retain]: message sent to deallocated instance 0x4d8e930
即使它与[单元格保留]一起使用;行,这看起来像是要分析的泄漏(和对我而言),所以我想解决问题。有人知道这是怎么回事吗?     
已邀请:
不要调用keepCount 绝对保留数是没有用的。
([cell retainCount] < 1)
不可能工作;
retainCount
永远不会返回零。 (是的-现在,框架已使人以5英镑的价格装入笔尖。Coolio。) 然后,您的问题出在其他地方,因为该代码(不带保留)是正确的。 它仍然很有可能是在常规事件循环耗尽之前发生的自动释放池耗尽。特别是某处某个地方对不应包含的单元格的引用微弱。 如果您启动分配工具并打开保留/释放事件记录,则可以确切看到调用该对象的保留/释放/自动释放的位置。导致崩溃的事件具有明显的价值。 但是,在这种情况下,您可能在某处缺少保留/释放对。至少,这可以解决这些症状。真正的问题可能是发生了某种UI转换,从而有效地过早地收获了某些内容,而应用程序的其他部分仍然依赖于它。添加一个保留/释放对,以便在整个过渡期间保留单元的寿命并不是真正的解决办法,因为可能还会存在其他依赖项。     

要回复问题请先登录注册