2012-01-26 83 views
12

我創建了一個協議,並將其分配給沒有實現的委託方法導致崩潰

@protocol AppBrainDelegate <NSObject> 
@optional 
- (void)didLocateUser; 
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData; 
@end 

@interface Brain : NSObject 
@property (strong, nonatomic) id <AppBrainDelegate> delegate; 

我認爲這@optional在協議中聲明的含義是指一個委託對象,該控制器沒有聽如果他們不想要的話,可以使用委託方法。

這裏是崩潰日誌,如果不在控制器中實現第一個委託方法。如果我這樣做,我不會崩潰。似乎我不明白將委託方法聲明爲可選的概念。你能向我解釋我的錯誤在哪裏嗎?

*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是: ' - [EventViewController didLocateUser]:無法識別的選擇發送到實例0x1fb300'

回答

35

@optional簡單地抑制編譯器警告,如果方法沒有在符合協議的類中實現。調用委託方法之前,你還需要檢查委託實現了它:

if ([delegate respondsToSelector:@selector(didLocateUser)]) { 
    [delegate didLocateUser]; 
} 

順便說一句,你已經創建使用strong語義您的委託財產。除非您有特別好的使用strong的理由,否則代表應該是weak,因爲您的Brain類不是自己的它的委託(如果您考慮對象圖)。

+0

謝謝!這做了蜱! – MrBr

+1

有這個完全相同的問題。謝謝你的提示。我也覺得@optional聲明不僅僅是壓制編譯器警告。 – Tander