2011-04-29 60 views
0

我创建一个UITableViewCell子类具有自定义笔尖,并在我的应用程序两种不同UITableViews使用它我。它可以在其中一个表格中完美运行,但当我大力滚动时,另一个表格会崩溃。文书识别此代码(的cellForRowAtIndexPath)僵尸:子类的UITableViewCell创建僵尸除非保留

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总是报告一个retainCount为2,所以它不应该是必需的。但如果我这样做:

if ([cell retainCount] < 1) { [cell retain]; }  // does not prevent zombies! 

它不起作用。没有alloc/init,所以我不应该做一个autorelease或担心这一切,我一直认为cellForRowAtIndexPath为我释放单元格。

当我不使用仪器,这里是我在Xcode得到的错误:

*** -[CALayer retain]: message sent to deallocated instance 0x4d8e930 

即使它的工作原理与[细胞保留];行,它看起来像分析(和我)的泄漏,所以我想解决这个问题。任何人都知道这里发生了什么?

+0

我有一点侦探想通了。问题发生在sublcassed UITableViewCell的dealloc中。我有一些实例变量和一些属性,我在dealloc中发布了所有这些属性。但是其中一些属性被@synthesized到了其中的一些实例变量,当它们配对时,它们只需要被释放一次。所以我评论了与属性绑定的实例变量版本,并解决了这个问题。我希望这可以帮助别人! – cetcet 2011-04-29 17:43:49

+0

避免在你的dealloc方法中使用属性是个好主意。房产调用可能会产生不必要的副作用。释放你的伊娃可以避免任何潜在的问题。 – kubi 2011-04-29 17:56:59

+0

这不是一个很大的问题,很多人通过属性发布变量,Apple甚至在他们的一些示例代码中做到了这一点......但所有事情都是平等的,直接访问iVar。 – kubi 2011-04-29 17:57:55

回答

2

不要调用retainCount

绝对保留数是无用的。

([cell retainCount] < 1)不可能工作; retainCount永远不会返回零。

-

你的问题,那么,其他地方就在于作为代码(不保留)是正确的(是啊。在cellForRowAtIndexPath:加载笔尖现在由框架库里欧祝福)。

它仍然是很可能是被在定期事件循环排出前发生的自动释放池漏。特别是,某个地方的某个地方对这个不应该存在的细胞有一个弱的参考。

如果你火起来的分配仪器并打开保留/释放事件的记录,你可以清楚地看到来电保留/释放/自动释放对象发生。导致崩溃的事件具有显而易见的价值。

在这种情况下,虽然,你可能错过了保留/释放对地方。至少,这将是解决症状的方法。真正的问题可能是某种UI转换发生,以至于某些内容被有效提前获得,而应用程序的某个其他部分仍然依赖它。添加一个保留/释放对,以便在该转换期间保留单元的生命周期并不是真正的解决方法,因为可能存在其他依赖关系。

+0

这样做自定义'UITableViewCell'不应该有任何性能问题。我做了几乎完全相同的事情,没有性能损失,这非常接近[Apple的建议](http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html #// apple_ref/DOC/UID/TP40007451-CH7-SW20)。 – kubi 2011-04-29 17:32:38

+0

我以前做过这件事,而且我没有看到任何性能问题。此外,我认为retainCount永远不会返回零,但我认为这是值得一试。 – cetcet 2011-04-29 17:39:37

+0

P.S.谢谢回复! – cetcet 2011-04-29 17:49:39