0

独自のXIBで定義されているいくつかのUITableCellViewの高さを取得しようとしています。UITableViewDelegateのコールバックheightForRowInPathIndexで使用される高さのリストを作成します。これを行うと、アプリケーションがメモリの破損のようにクラッシュします。

arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil];

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0];

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz];

[arrayOfTableCellView release];

私はretainCountを調べましたが、期待どおりです。

4

1 に答える 1

1

答えは、ドキュメントから簡単です。

戻り値

nibファイルの最上位オブジェクトを含む配列。配列には、ファイルの所有者またはプロキシオブジェクトへの参照は含まれていません。これには、nibファイルがアーカイブ解除されたときにインスタンス化されたオブジェクトのみが含まれます。nibファイルオブジェクトが時期尚早に解放されないように、返された配列またはそれに含まれるオブジェクトを手動で保持する必要があります。

に戻り値を割り当てているようですarrayOfTableCellView。戻り値を保持したいが、arrayOfTableCellView実際にはviewControllerのプロパティである場合は、を使用して割り当てる必要がありますself.arrayOfTableCellView

あなたがそれを保持していない場合、あなたはそれを所有していないのでそれを解放する必要はありません。したがって、実際にこのような配列を取得すると

NSArray *arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil];

その後、あなたは持っていたくない

[arrayOfTableCellView release];

オブジェクトを割り当てなかったので、そこにあります。

編集:

これをわかりやすく説明するために、コードを実行したところ、期待どおりの結果が得られました。

NSArray * arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"JLUViewController" owner:self options:nil];

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0];

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz];

上記のコードはクラッシュしたり、リークを引き起こしたりしません。Instrumentsはリークを報告しないので、問題ありません。

追加する場合

[arrayOfTableCellView release];

クラッシュしますが、所有していないオブジェクトを解放しようとしたため、EXC_BAD_ACCESSが報告されます。NSArrayをローカル変数にした方法に注目してください。関数のスコープ内で使用するだけなので、プロパティである必要はないので、同じことを行う必要があります。またarrayCellHeights、がビューコントローラ内のプロパティである場合は、常にを使用self.arrayCellHeightsしてアクセスすることに注意してください。

于 2012-05-07T17:48:02.843 に答える