2011-11-02 35 views
5

我編寫iOS應用程序並使用imageStore庫來延遲加載圖像並將它們緩存在內存中。 (https://github.com/psychs/imagestore)iOS檢查代理是否存在調用方法

在視圖控制器創建imagestore例如:

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

當圖像加載successfuly,imagestore電話委託方法

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

,這樣做reloadData在tableview上重繪單元格。 所有作品都不錯。但有問題:如果ViewController didUnload(回到導航控制器)和圖像加載,應用程序完成與崩潰,因爲imagestore調用卸載ViewController的方法。

我儘量做到以下幾點: 1)的ViewController我將此代碼放在viewDidUnload部分:

imageStore.delegate = nil; 
imageStore = nil; 

2)在imageStore我增加檢查零:

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

它的工作原理,但無論如何應定期應用程序崩潰

+0

'2)'是不需要的。消息可以安全地發送到'nil'對象。 – Nekto

+0

感謝您的回答!但沒有它崩潰100%,如果圖像加載和viewcontroller卸載... –

回答

12

請嘗試將此代碼放在dealloc節上。

imageStore.delegate = nil; 
imageStore = nil; 

以同樣的方式,如果因爲一個零對象的任何調用是由應用程序忽略,所以如果你有這樣的事情條款是沒有必要的:

id delegate = nil;  
[delegate callAnyMethod]; 

有沒有影響你的應用程序的行爲,在另一方面,如果方法代表的調用是可選的,你應該ASURE該委託響應選擇器,這樣的事情應該做的伎倆:

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

乾杯!

0

它的工作原理,但定期應用程序崩潰無論如何。

這是一個矛盾。有兩種可能性:

  1. 您的修復工作,並且該應用程序崩潰的其他原因。

  2. 您的修復程序無法正常工作,應用程序繼續崩潰的原因與之前崩潰的原因相同。

如果不知道這兩種可能性實際上發生哪種情況,很難知道什麼是錯的。查看錯誤消息和崩潰的證據,例如堆棧檢索。爲什麼應用程序崩潰?它是否嘗試取消引用delegate屬性而不先檢查它?它是否依賴於委託人在做某件事情,所以如果委託人不再存在,那麼這件事就不會完成,並導致崩潰?這些是我想要尋找的東西,但最重要的是從你擁有的證據開始,並遵循你的鼻子。

相關問題