0

私のコードスニペット:

- (void)viewDidUnload{
    [super viewDidUnload];
    self.statusView = nil;
    self.tableView = nil;
    self.noDataView = nil;
}

まれな状況で、アプリがラインでクラッシュしましたself.noDataView = nil;。でデバッグするpo selfと、現在のコントローラー以外を指しているように見えました。考えられる理由は?

PS:self.tableViewdelegateandはinメソッドdataSourceに設定されています。それはこれと関係がありますか?selfinit

4

2 に答える 2

1

まず、[super viewDidUnload]最後のステートメントとして使用する必要があります。ただし、おそらくエラーは修正されません。

あなたの問題の理由は非常に簡単です。コントローラーがどこかでオーバーリリースされています。ゾンビ検出を有効にしていますか? アプリケーションがクラッシュするコードは、問題が以前に発生したため、通常は無関係です。

于 2013-09-11T09:13:46.787 に答える
0

viewWillUnloadは現在非推奨であり、もう当てにすることはできません。それについての質問は、以下の参照につながります。

アップル より:

iOS 6 では、UIViewController の viewWillUnload および viewDidUnload メソッドは非推奨になりました。これらのメソッドを使用してデータを解放していた場合は、代わりに didReceiveMemoryWarning メソッドを使用してください。このメソッドを使用して、View Controller のビューが使用されていない場合に参照を解放することもできます。これを行う前に、ビューがウィンドウ内にないことをテストする必要があります。

WWDC 2012 の引用:

メソッド viewWillUnload および viewDidUnload。もう電話するつもりはありません。つまり、私たちが行った費用便益の方程式と分析のようなものがあります。初期の頃は、メモリ警告が発生したときにビューをアンロードすることを確実にするために、実際のパフォーマンスが必要でした。あらゆる種類のグラフィックスやバッキング ストアなどがあり、それらもアンロードされました。ビューとは別にそれらをアンロードするようになったので、それらをアンロードすることはそれほど大したことではありません。また、ポインターが存在する場所に非常に多くのバグがありました。

編集: iOS 5.1 の問題についてviewDidUnloadは、ビューが作成されたときに作成したものを解放するために使用されるため、オブジェクトを作成または保持しない限り、viewDidLoadまたはnibでそれらを解放することはできませんviewDidUnload

于 2013-09-11T04:28:14.773 に答える