2010-11-22 59 views
12

我創建了一個委託類調用可選的委託方法

@protocol gameDelegate <NSObject> 
@optional 
-(void)gameStarted; 
@required 
@end 

現在在我的遊戲對象我稱這種方法:所以現在

[self.delegate gameStarted]; 

,如果我在任何地方啓動該對象,並設置委託一切工作正常,直到gameStated被調用,因爲它沒有在創建遊戲對象的主對象中實現(因爲它的可選)。

我想這

if(![self.delegate respondsToSelector: @selector(gameStarted)]) { 
    //[self.delegate gameStarted]; 
} 

一些改變,但是這不是爲我工作。 任何想法如何使這個「真正」可選?

在此先感謝

回答

18

if聲明省略了否定:

if ([self.delegate respondsToSelector:@selector(gameStarted)]) { 
    ... 
} 
+0

哦,我的上帝:d我第一次使用這個if語句的如果它沒有響應,則提早返回,然後我將其複製到此方法。多麼愚蠢的錯誤。感謝 – choise 2010-11-23 09:34:51

0

檢查如果委託實現了一個可選的方法,然後調用它是我用宏SAFE_CALL預處理器這樣的通用模式檢查respondToSelector:然後調用該方法。

宏:

#define SAFE_CALL(obj,method) \ 
([obj respondsToSelector:@selector(method)] ? [obj method] : nil) 

,它是這樣使用:

SAFE_CALL(sourceDelegate, refresh) 
// or 
NSString *response = SAFE_CALL(object, responseValue) 

注意:此版本僅適用於不帶參數的方法。

最初它是作爲C函數實現的,但是在使用ARC時,會導致使用performSelector泄漏的警告。作爲預處理器宏,它的工作原理與預期完全相同。

1

要迅速做到這一點,我提出以下建議:

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

然後調用optionaldelegate對象,簡單的使用if delegate.optionalMethod?(){}