12

我为一个班级创建了一个代表

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

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

[self.delegate gameStarted];

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

我尝试了一些变体

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

但这对我不起作用。任何想法如何使这个“真正”可选?

提前致谢

4

3 回答 3

18

if从你的陈述中省略否定:

if ([self.delegate respondsToSelector:@selector(gameStarted)]) {
    ...
}
于 2010-11-22T22:53:09.150 回答
1

为了快速完成此操作,我建议以下内容:

@objc protocol MyDelegate {

optional func optionalMethod()

}

class MyClass : MyDelegate {

// optionalMethod() does not have to be declared

}

然后调用optional你的delegate对象,简单的使用if delegate.optionalMethod?(){}

于 2016-02-24T00:50:57.877 回答
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 函数实现的,但是performSelector在使用 ARC 时会导致警告和泄漏。作为一个预处理器宏,它的工作方式完全符合预期。

于 2014-02-11T09:18:23.843 回答