调用可选的委托方法

时间:2010-11-22 22:50:18

标签: iphone objective-c delegates optional

我为一个类

创建了一个委托
@protocol gameDelegate <NSObject>
@optional
-(void)gameStarted;
@required
@end

现在在我的游戏对象中我调用了这个方法:

[self.delegate gameStarted];

现在,如果我在任何地方启动此对象并设置委托,一切正常,直到gameStated被调用,因为它没有在创建游戏对象的主对象中实现(因为它是可选的)。

我尝试了一些

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

但这不适合我。 任何想法如何使这“真正”可选?

提前致谢

3 个答案:

答案 0 :(得分:18)

忽略if声明中的否定:

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

答案 1 :(得分:1)

要在swift中完成此操作,我建议如下:

@objc protocol MyDelegate {

optional func optionalMethod()

}

class MyClass : MyDelegate {

// optionalMethod() does not have to be declared

}

然后拨打optional对象上的delegate,简单地使用if delegate.optionalMethod?(){}

答案 2 :(得分: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泄漏的警告。作为预处理器宏,它完全按预期工作。