0

カスタム nib を使用して UITableViewCell サブクラスを作成し、アプリの 2 つの異なる UITableView で使用しています。テーブルの 1 つで完全に動作しますが、激しくスクロールすると他のテーブルがクラッシュします。Instruments は、このコード (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 は常に保持カウント 2 を報告するため、必要ありません。しかし、私がこのようなことをすると:

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

うまくいきません。alloc/init がないので、autorelease を実行したり、これについて心配したりする必要はまったくありません。また、cellForRowAtIndexPath がセルを解放してくれるといつも思っていました。

Instruments を使用していない場合、xcode から得られるエラーは次のとおりです。

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

[セル保持]で動作しますが。Analyze に (そして私にも) リークのように見えるので、問題を解決したいと思います。ここで何が起こっているか知っている人はいますか?

4

1 に答える 1