2011-12-31 13 views
1

私はここで少し迷っています。誰かが間違ったところを指摘してくれることを願っています。didReceiveMemoryWarningの後のiOS UITableViewの空白

私のアプリケーションは、iPads向けのマスター/ビューアプリケーションです。

私のMasterViewはUITableViewを継承し、didReceiveMemoryWarningがない限り正常に動作します。私はカスタムセルの内容を持っている、そしてそれはすべての扱いを扱う。これまでのところとても良いし、ビルドには数時間しかかかりませんでした。

しかし、いったんdidReceiveMemoryWarningを取得すると、self.tableViewは不思議な振る舞いをするようです。 numberOfSectionsInTableViewとのtableView:numberOfRowsInSection:メソッドは再び呼び出されることはありませんし、私のコードは次のように(メモリの警告の後)最初の項目を選択しようとしたとき:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
       animated:NO 
       scrollPosition:UITableViewScrollPositionMiddle]; 

それは

でクラッシュ - [ UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]:セクション(0)の境界(0)を超える行(0)。 '

だから何ですか?私のtableViewのメモリがメモリ警告中に完全に消去された場合、なぜそれはnilに設定されませんでしたか?また、私はどのようにそれをもう一度構築するのですか?

答えて

1

インターフェイスビルダーごとにtableviewをコードごとに実装していますか?あなたは自己を使用するとき、私はあなたが保持とプロパティを使用すると仮定します。 viewDidUnLoadでこの値をnilに設定し、deallocメソッドでフィールドポインタを解放するかどうかを確認してください。そうでない場合、問題はどこか他のところに置かれますが、私はあなたがその良い習慣のためにそれをすると仮定します。

コードでtableviewを構築し、viewDidUnloadでプロパティをnilに設定した場合は、メモリ警告を受け取った後に再度割り当てなければなりません。それを行う場所は、viewDidLoad、initWithなどとなります。NavまたはTabBarControllerに戻るとすぐに呼び出されるので、Viewの読み込みは主により良いオプションです。

インターフェイスビルダを使用していて、ビューがAppDelegate(たとえばdidFinishLaunchingWithOptionsメソッド)に読み込まれる場合、awakeFromNibメソッドは、再度呼び出さない限り、再度呼び出されません。だから、DONTはあなたのviewDidUnloadのインスタンス変数をnilに設定します。それ以外の場合はインターフェイスビルダーのtableviewへのポインタが失われます。この最後の部分は理由かもしれませんが、実際にはIMOの良い習慣ではないからです。

あなたのコードについてもっと詳しく教えれば、私はあなたをより具体的に助けることができます。

挨拶 マルクス

+0

こんにちはマルクス、書き込みに感謝。私はお詫びします、私はコンテキストを与えていない:OSX 10.6.8、Xcode 4.2、プロジェクトは、ARCを使用していますターゲットは、iOS 5.0.0を実行しているiPad 2です。 –

+0

問題は、テーブルの内容が浮かび上がっていることが判明しました。配列の内容とともに、テーブルに何を入れるべきかを知ることができます。 'docs'という名前の配列は 'nil'されているので、[docs count]は '0'ではなく 'nil'を返していたので、selectRowAtIndexPathに到達すると、 '0'行ではありません。 –

+0

「nil」オブジェクトがクラッシュすることなくメッセージを受け取れるようにすることは、ObjectiveCの基本的な誤りです。戻りオブジェクトの型をintからnilに変更するからです。 [docs count]行でクラッシュが発生した場合は、別の方法ではなく、どこに問題があるのか​​正確に知っていたはずです。 –

関連する問題