2011-11-02 12 views
5

iOSアプリケーションを作成し、imageStoreライブラリを使用してレイジーロードイメージを作成し、メモリにキャッシュします。 ViewControllerをオン(https://github.com/psychs/imagestore)iOSは呼び出しメソッドの前にデリゲートが存在するかどうかを確認します

私はimagestoreインスタンスを作成します。

imageStore = [ImageStore new]; 
imageStore.delegate = self; 

画像がsuccessfulyロードされ、imagestore呼び出しデリゲートメソッド

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url 

reloadDataをやっていますセルを再描画するためのテーブルビュー。 すべてはうまく動作します。しかし、問題があります:もしViewController didUnload(ナビゲーションコントローラに戻る)とイメージがロードされて、アプリケーションがクラッシュで終了しました。イメージストアは、アンロードされたViewControllerのメソッドを呼び出すためです。

私は、次のやろう

:私はviewDidUnloadセクションにこのコードを配置 1)のViewControllerに:

imageStore.delegate = nil; 
imageStore = nil; 

2)imageStoreでは、私はゼロのチェックを追加しました:

if(delegate != nil) { 
    ...call delegate method 
} 

それは動作しますが、とにかく定期的にアプリがクラッシュする。

+0

'2)'は不必要です。メッセージは 'nil'オブジェクトに安全に送ることができます。 – Nekto

+0

お返事ありがとうございます!イメージがロードされ、viewcontrollerがアンロードされた場合、それは100%クラッシュせずに... –

答えて

12

このコードをdeallocセクションに配置してください。

id delegate = nil;  
[delegate callAnyMethod]; 

あなたの中には効果がありません:あなたはこのような何かを持っている場合ので、nilのオブジェクトへの呼び出しは、アプリケーションによって無視されるため、if節は必要ありません同じように

imageStore.delegate = nil; 
imageStore = nil; 

アプリケーションの動作が、一方では、メソッドのデリゲートの呼び出しは、あなたがそのデリゲートがセレクタに応答しアシュアすべきオプションであるならば、このようなものは、トリックを行う必要があります。

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) { 
     [delegate imageStoreDidGetNewImage:imageStore url:url]; 
} 

乾杯を!

0

これは動作しますが、定期的にアプリがクラッシュします。

これは矛盾です。 2つの可能性があります:

  1. あなたの修正はうまくいっていて、アプリは何らかの理由でクラッシュしています。

  2. 修正プログラムが機能しませんでした。以前と同じ理由でアプリがクラッシュし続けます。

これらの2つの可能性が実際に起こっているかどうかわからないと、何が間違っているのかを知ることは難しいです。エラーメッセージと、スタッククロールなどのクラッシュの証拠を確認します。なぜアプリケーションがクラッシュするのですか? delegateプロパティを最初にチェックせずにどこか参照解除しようとしていますか?それはデリゲートが何かをしていることに依存しているので、デリゲートがもう存在しない場合、そのことは行われず、クラッシュすることになりますか?これは私が探しているものですが、もう一度最も重要なことは、あなたが持っている証拠から始まり、あなたの鼻に従うことです。

関連する問題