0

私はiPhoneアプリを初めて使用し、タブベースのアプリを作成しようとしています。両方のタブで画像の上にテーブルを配置しようとしています。オーディオリンクの表が表示されたタブと、ビデオリンクの表が表示された他のタブ。

これはすべて順調に進んでいます。2つのテーブルに対して2つのviewControllerを作成しました。すべてのコードは、それを機能させることを除けばうまく機能します。2番目のタブのvideoTableViewControllerの-(void)dealloc{}でスーパーdeallocをコメントアウトする必要があります。

そうでない場合は、次のエラーメッセージが表示されます。

FREED(id):メッセージnumberOfSectionsInTableView:解放されたオブジェクトに送信されます

助けてください、なぜそれがこれをしているのか分かりません...

4

2 に答える 2

1

を呼び出していない場合は[super dealloc]、オブジェクトの割り当てが解除されておらず、メモリリークが発生しています。への呼び出しのコメントを解除する必要があります[super dealloc]

上記の例外は、テーブルビューがデータソースとして割り当て解除されたオブジェクトにアクセスしようとしていることを意味します。これはあなたが解決する必要がある問題です。おそらく、この呼び出しを行っているテーブルビューは、割り当てが解除されたビューコントローラによって所有されています。

ビューコントローラがのサブクラスでない場合は、保持しているテーブルビュー参照を参照UITableViewControllerする必要があります。releaseそれがのサブクラスである場合UITableViewController、そのテーブルビューがretain編集されるべきではない場所に他の場所が存在する必要があります。

于 2010-03-29T16:30:48.350 に答える
0

UITableViewController独自のtableViewオブジェクトのメモリ管理を処理するため、理論的には心配する必要はありません。

アレックスが言ったように、電話をかけないのは間違いなく悪いこと[super dealloc]です。それを省くのはメモリリークです。

これを解決するには、テーブルビューがビューコントローラよりも長く存続している理由を理解する必要があります(これがFREED(id)エラーの原因です)。1つの推測は、ビューをビュー階層に残しているが、コントローラーを解放しているということです。あるViewControllerから別のViewControllerに移動する場合の望ましい動作は、View Controllerを呼び出し[oldView removeFromSuperview]から解放することにより、ビュー階層から古いビューを削除することです(解放する場合)。重要な理由removeFromSuperviewは、スーパービューは常にサブビューを保持するため、tableViewが非常にアンデッドである理由である可能性があります。

アプリがメモリを大量に消費しない場合は、View Controllerを割り当てたままにする(解放しない)のが最も簡単な場合があります。これで問題は解決しますが、テーブルビューが予想よりも長く存続するという問題には実際には対処していません。これは、クリーンアップすると便利な非効率的なコードの症状である可能性があります。

于 2010-03-29T17:58:12.293 に答える