objective-c - 如何在运行时识别协议(protocol)方法是可选的?

标签 objective-c ios cocoa ios5 protocols

我已经定义了我的协议(protocol)。我已经提到我的两个协议(protocol)方法是可选的。在运行时,如何确定特定方法是否可选?有什么办法可以查出来吗?

最佳答案

这应该做你想做的:

BOOL MethodInProtocolIsRequired(Protocol *protocol, SEL methodSelector)
{
    struct objc_method_description methodDesc = protocol_getMethodDescription(protocol, methodSelector, YES, YES);
    return methodDesc.name != NULL;
}

请注意,我并不是在评论在运输代码中使用它的可取性,特别是因为您还没有解释为什么要这样做。另请注意,当为协议(protocol)不包含的方法提供选择器时,此函数将返回 NO。这基本上是合理的(毕竟,如果协议(protocol)不包含方法,则不需要!),但是您可以通过检查协议(protocol)是否包含该方法作为可选方法并返回不同的内容来为函数添加复杂性所有三种情况(必需、可选、不符合协议(protocol))。

编辑:此处的简单测试程序:https://gist.github.com/4381753

关于objective-c - 如何在运行时识别协议(protocol)方法是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14043930/

相关文章:

ios - 在 iOS 7 中运行捕获 session 时无法设置 session 预设

xcode - 代码会跳过直到 NSTask 完成

cocoa - 如何使用 Perl 中的 OS-X ScriptingBridge 框架关闭窗口?

objective-c - NSTextView 中是否可以有 float 图像或文本框,或者我将使用什么来做到这一点?

objective-c - 在后台线程上加载 Nib

iphone - 用于 iPhone 应用程序构建的最佳硬件是什么?

objective-c - UILabel 子类在 Objective-C 中显示为 UILabel

ios - 如何在 Core Data 中为 iOS 开发指定基数

ios - 处理内存管理和 iOS Cordova 项目?

iphone - 解析具有从 JSON 消息生成的单个值的 NSArray