カスタム 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 に (そして私にも) リークのように見えるので、問題を解決したいと思います。ここで何が起こっているか知っている人はいますか?