我创建一个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
即使它的工作原理与[细胞保留];行,它看起来像分析(和我)的泄漏,所以我想解决这个问题。任何人都知道这里发生了什么?
我有一点侦探想通了。问题发生在sublcassed UITableViewCell的dealloc中。我有一些实例变量和一些属性,我在dealloc中发布了所有这些属性。但是其中一些属性被@synthesized到了其中的一些实例变量,当它们配对时,它们只需要被释放一次。所以我评论了与属性绑定的实例变量版本,并解决了这个问题。我希望这可以帮助别人! – cetcet 2011-04-29 17:43:49
避免在你的dealloc方法中使用属性是个好主意。房产调用可能会产生不必要的副作用。释放你的伊娃可以避免任何潜在的问题。 – kubi 2011-04-29 17:56:59
这不是一个很大的问题,很多人通过属性发布变量,Apple甚至在他们的一些示例代码中做到了这一点......但所有事情都是平等的,直接访问iVar。 – kubi 2011-04-29 17:57:55