2011-12-07 9 views
0

私は、sqliteデータベースからデータをロードしている主アプリケーションデリゲートにオブジェクトの配列を作成しました。 TableViewを読み込むと、このクラスのプロパティはオブジェクトの配列を指すように設定されます。次に、TableViewが表示されると、行数に対する配列のカウントが正しく返され、配列内の適切なオブジェクトのプロパティからセル内のテキストが表示されます。objective-cテーブルビューが再読み込み時にクラッシュする

ナビゲーションバーの右上には、ネットワークからXMLファイルをダウンロードして解析し、データベースを更新する更新ボタンもあります。

データベースからオブジェクトのメイン配列を再作成し、自分のTableViewプロパティを新しい配列にポイントしてから、TableViewにデータを再読み込みするよう依頼します。これがEXC_BAD_ACCESSでクラッシュする場所です。

私はデバッガをステップ実行し、reloadDataコールまですべてが正しいことを確認しました。データベースとメイン配列は両方とも同期され、カスタムTableViewプロパティもメイン配列を指しています。

次に、私がデバッガをステップ実行するとき、私はいくつか気がついた。まず、numberOfRowsInSectionを呼び出すと、メイン配列へのポインタが正しく、行数が正しいことになります。第2に、最初のcellForRowAtIndexPath呼び出しに到達すると、メイン配列へのポインタが無効なメモリセクションを指しています。実際のメモリアドレスは同じですが、オブジェクトの配列は消えています。

リファレンスカウントがゼロより大きくなければならないので、このようなリロードの途中で配列がどのように消えているのか理解できません。ガベージコレクションは不要です。だから私の質問は、何が起こっているかも知りません。第2に、問題の正確な位置をどのように判断するのですか?

+0

私は配列がリリースされていると仮定していることを指摘しておきます。デバッガは配列の値をオブジェクトの実際の数ではなく '{(int)[$ VAR count]} objects'として表示します。 – richard

答えて

2

あなたはほぼ確実にアレイを保持しています。 「私の参照カウントは依然としてゼロより大きくなるはずです」と言っても、それはほぼ確実ではありません。それがあれば、それは解放されなかったであろう。

まず、あなたがivarsに直接アクセスする場所を探してください。これはメモリ管理エラーの第1の原因です。 deallocとinitを除くアクセサー(self.thing)を介してのみivarsにアクセスします。これにより、この種の問題の90%が解決されます。

+0

私はあなたがこれによって何を意味するか分かりません。どのようにアクセサーを使わずにivarsにアクセスしますか? – richard

+0

"thing"というプロパティがあり、それを直接 "ivar"にアクセスする "thing"と呼んでいる場合。あなたがそれをアクセサリーを使っている "self.thing"と呼ぶならば。 "thing"と "self.thing"はObjCで異なるコードを実行します。 –

+0

ありがとうございます。私は自分のコードを見て、私が見つけたものであなたを更新します。 – richard

関連する問題