1

NavigationController スタックにプッシュされる ViewController があります。スタックにプッシュされるとすぐに、バックグラウンド スレッドで画像のダウンロードを担当するダウンローダー オブジェクトを使用して、いくつかの画像のダウンロードを開始します。画像のダウンロードには、WiFi 経由であっても数秒かかる場合があります。画像のダウンロードが完了すると、ダウンローダ オブジェクトは ViewController にその画像をレイアウトするように指示し、新しくダウンロードした画像をページ化された UIScrollView の背面に配置します。ただし、この間にユーザーが [戻る] ボタンを押した可能性があり、ViewController が解放/割り当て解除された可能性があるため、ダウンローダー オブジェクトによって SIGABRT エラー メッセージが発生し、アプリがクラッシュします。

この状況にどのように対処すればよいですか?解放された/割り当て解除されたインスタンスを確認する方法はありますか? または、エラーをキャッチしてログに記録し、無視する方法はありますか?

4

3 に答える 3

3

あなたの最善の策は、ゼロ化弱参照を使用することです。もちろん、iOS 5.0 では、これは単なる「弱い」リファレンスです。ただし、iOS 5.0 未満をターゲットにしている場合は、そのためのカスタム ソリューションが必要です。この記事で Mike Ash によって説明された素晴らしいものがあります。

于 2012-05-18T07:27:57.760 に答える
1

通知を使用して問題を回避できますか? viewController を参照するダウンローダ オブジェクトの代わりに、viewController (読み込まれている場合) が応答する通知を投稿します。

データ読み込みオブジェクトで:

[[NSNotificationCenter defaultCenter] postNotificationName:@"allDataLoaded" object:nil];

あなたのView Controller viewDidLoadで:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshMyLayout) name:@"allDataLoaded" object:nil];

あなたのView Controllerのdeallocで:

[[NSNotificationCenter defaultCenter] removeObserver:self];

viewController からの逆通知を viewDidUnload に入れて、データ ダウンローダーにダウンロードをキャンセルするように指示することもできます (必要な場合)。

于 2012-05-18T09:54:09.863 に答える
0

結果が不要になったら、ダウンロードをキャンセルすることをお勧めします。これにより、不要なデータ トラフィックとメモリの消費が防止されます。

それができない場合、ダウンローダー オブジェクトnilには、結果に関心がなくなったときに (たとえば、ビュー コントローラーのdeallocメソッドで) 設定できるある種のデリゲート (おそらくビュー コントローラー) が必要です。iOS 5 を対象とする場合は、弱い参照をゼロにすることもオプションですが、ダウンロードをキャンセルする方がはるかに優れていますNSURLConnection

于 2012-05-18T10:27:44.127 に答える