Iphone 子类UITableViewCell创建僵尸,除非保留

Iphone 子类UITableViewCell创建僵尸,除非保留,iphone,uitableview,nszombie,Iphone,Uitableview,Nszombie,我创建了一个带有自定义nib的UITAbleViewCell子类,并在我的应用程序中的两个不同UITableView中使用它。它在其中一个表中工作得很好,但是当我用力滚动它时,另一个表崩溃了。Instruments在此代码中标识僵尸(在cellForRowAtIndexPath中): 注意[cell retain];行-当它在那里,代码工作顺利。把它拿出来,然后崩溃。NSLog总是报告重新计数为2,因此不必这样做。但如果我这样做: if ([cell retainCount] < 1

我创建了一个带有自定义nib的UITAbleViewCell子类,并在我的应用程序中的两个不同UITableView中使用它。它在其中一个表中工作得很好,但是当我用力滚动它时,另一个表崩溃了。Instruments在此代码中标识僵尸(在cellForRowAtIndexPath中):

注意[cell retain];行-当它在那里,代码工作顺利。把它拿出来,然后崩溃。NSLog总是报告重新计数为2,因此不必这样做。但如果我这样做:

   if ([cell retainCount] < 1) { [cell retain]; }       // does not prevent zombies!
即使它与[cell retain]一起工作;行,它看起来像一个泄漏进行分析(对我来说),所以我想解决这个问题。有人知道这里发生了什么吗?

不要打电话给retainCount 绝对保留计数是无用的

([cell retainCount]<1)
不可能工作<代码>重新计数永远不能返回零

(是的——在
cellforrowatinexpath:
中加载nib现在受到framework.coulio的支持。)

那么,您的问题就在于其他地方,因为该代码(不带retain)是正确的

它仍然很可能是在常规事件循环排放之前发生的自动释放池排放。特别是,某个地方的某个单元格引用较弱,不应该引用

如果启动分配工具并启用保留/释放事件录制,则可以确切地看到对象的保留/释放/自动释放调用发生的位置。导致崩溃的事件具有明显的价值


不过,在这种情况下,您可能在某个地方丢失了保留/释放对。至少,这可以解决这些症状。真正的问题很可能是发生了某种用户界面转换,使得某些内容在应用程序的其他部分仍然依赖它的情况下被有效地提前获取。添加保留/释放对,以便在转换过程中保留单元格的寿命,这并不是一个真正的修复方法,因为可能存在其他依赖项。

以这种方式执行自定义
UITableViewCell
,应该不会有任何性能问题。我已经做了一些几乎相同的事情,没有表现惩罚,这非常接近。我以前做过,我没有看到任何表现问题。另外,我假设retainCount永远不会返回零,但我觉得值得一试。我通过一点调查发现了这一点。该问题发生在分箱UITableViewCell的dealloc中。我有一些实例变量和一些属性,所有这些都是在dealloc中发布的。但是一些属性被@synthesis合成为一些实例变量,当它们以这种方式配对时,它们只需要一起释放一次。因此,我注释掉了绑定到属性的实例变量版本,它解决了这个问题。我希望这能帮助别人!最好避免在dealloc方法中使用属性。属性调用可能会产生不必要的副作用。发布你的ivar避免了任何潜在的问题。这不是一个大问题,很多人通过属性发布变量,苹果甚至在他们的一些示例代码中这样做。。。但在一切平等的情况下,直接访问iVar。谢谢您的评论!当你说“在dealloc方法中使用属性”时,你的意思是“在dealloc方法中释放属性”吗?我的意思是:
self.property=nil而不是
[属性发布]
   if ([cell retainCount] < 1) { [cell retain]; }       // does not prevent zombies!
*** -[CALayer retain]: message sent to deallocated instance 0x4d8e930