- (void)someMethod
{
    if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
    {
        if ( [delegate operationShouldProceed] )
        {
            // do something appropriate
        }
    }
}

documentation人说:

只有正式协议中的可选方法或非正式协议中的方法才需要预防措施

这是什么意思?如果我使用正式的协议,我可以只使用[delegate myMethod]

推荐答案

你几乎在你认为需要的时候使用它:判断一个对象是否实现了你要调用的方法.Usually当你有一个可选的方法或一个非正式的协议时,这就完成了.

我只在编写必须与委托对象通信的代码时使用过respondsToSelector.

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

有时,如果不确定返回对象的类是什么,您可能会希望在任何返回的方法上使用respondsToSelector,而在id或泛型NSObject上使用respondsToSelector.

Objective-c相关问答推荐

如何从 Cocoa 的 NSDictionary 中获取特定键的值?

错误无法使 UICollectionElementKindCell 类型的视图出列

使用自动布局自定义纵横比

如何使用 UIStepper

NSError 和 __autoreleasing

保存 UIImage,以错误的方向加载它

获取按其各自值排序的 NSDictionary 键

在objective-c / cocoa-touch中是否有一个方便的功能来找到最小的数字?

何时使用静态字符串与 #define

主队列上的 dispatch_sync 在单元测试中挂起

如何测试推送通知在我的应用程序中是否有效

如何在 iPhone 上默认显示数字键盘?

UILabel 的角半径属性在 iOS 7.1 中不起作用

自定义 UISwitch 和 App Store 批准

如何保存我的 iPhone 应用程序的用户首选项?

以编程方式访问应用标识符前缀

如何在 iOS 7 启动期间更改状态栏样式

HTML 内容适合 UIWebview 而无需缩小

UILabel 根据要显示的文本自动调整大小

判断 UIViewController 是否即将从导航堆栈中弹出?