2012-05-07 3 views
0

私は自分のXIBで定義されているいくつかのUITableCellViewの高さを取得しようとしています。私は、UITableViewDelegateのコールバックheightForRowInPathIndexで使用される高さのリストを作成します。私がこれを行うと、アプリケーションはメモリ破壊のようにクラッシュします。ios:フレームの高さを取得してメモリを破壊するために、一時的なXIBのロードがあるのはなぜですか?

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を見ていて、それは期待通りです。

+1

メモ:あなたはretainCountを信用すべきではありません。あなたは何が舞台裏で起こっているのか分からない。どのようなエラーが出ますか?私はそれがEXC_BAD_ACCESSだと仮定しますか? –

+0

BTW - エラーがアプリケーションから飛び出していました。インストルメンテーションでは、私の経験では、これらのほとんどがメモリの保持/解放の矛盾であることが判明しています。場合によっては、ゾンビ。 – mobibob

答えて

1

まあ答えはドキュメントから、単純です:

戻り値

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

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

あなたがそれを保持していない場合は、所有していないためにリリースする必要はありません。あなたが実際にこの

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

のような配列を取得するときにオブジェクトを割り当てることができませんでしたので、それでは、あなたは、そこに

[arrayOfTableCellView release]; 

を持っている必要はありません。

EDIT:

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]; 

上記のコードは、漏れをクラッシュしたり、発生しません。

ちょうどあなたにこれをcalarifyするため、私はちょうど期待される結果と、あなたのコードを実行しました。インストゥルメンツは漏れを報告しないので、うまくいくでしょう。

あなたはあなたが所有していないオブジェクトを解放しようとしたので、それが、EXC_BAD_ACCESSを報告し、クラッシュしてしまいますけれども、あなたが

[arrayOfTableCellView release]; 

追加した場合。どのようにNSArrayをローカル変数にしたのでしょうか?関数のスコープ内で使用するだけなので、プロパティである必要はないので、同じことを行う必要があります。また、arrayCellHeightsがviewcontroller内のプロパティの場合は、常にself.arrayCellHeightsを使用してアクセスしてください。

+0

OK - もう少しテストをさせてください。しかし、もともと「保持」していなかったとき、インストゥルメンツはリークを宣言しました。配列の保持カウントを「NSLog」にすると、loadNibNamedからのものとみなして1に設定されます。言いましたが、上のあなたのコメントでは、舞台裏で魔法の価値があるので、私はその価値を信じることができないと述べています。 – mobibob

+0

@mobibob:これでどこにいらっしゃいましたか? –

+0

私のクラッシュは、アプリケーションのメモリ占有量に関するiOS4の問題の副作用でした。明らかに、iOS5は、iOS4と比較して、最初の起動(x4またはx10)にもっと多くのメモリを割り当てます。アプリケーションの初期サイズを小さくするとすぐに問題は解消されました。それは後で同じ理由でクラッシュしましたが、iOS5では永遠に実行されます。それを経営者に納得させるようにしてください:) – mobibob

関連する問題