ios - 如何判断一个选择器是否包含在objc中的一个协议(protocol)中?谢谢

标签 ios objective-c

出于某种原因,我想将所有 UITableViewDelegate 方法转发到另一个对象。这是我编写的代码,但是因为 UITableViewDelegate 中有很多方法。我必须为每个方法编写许多 if else 比较。

- (id)forwardingTargetForSelector:(SEL)aSelector
{    
    NSString* selector = NSStringFromSelector(aSelector);
    if ([selector isEqualToString:@"tableView:didSelectRowAtIndexPath:"])
    {
        return self.outDelegate;
    }
    else
    {
        return [super forwardingTargetForSelector:aSelector];

    }
}

我认为有一个更好的解决方案可以做到这一点。我可以像下面这样做吗,如何测试选择器是否在协议(protocol)中定义

- (id)forwardingTargetForSelector:(SEL)aSelector
{    
    if (**aSelector is Defined in aProtocol**)
    {
        return self.outDelegate;
    }
    else
    {
        return [super forwardingTargetForSelector:aSelector];

    }
}

最佳答案

您可以使用 protocol_copyMethodDescriptionList 获取协议(protocol)中方法的 C 数组:

int numOfMethods;
struct objc_method_description * method_description_list;
method_description_list = protocol_copyMethodDescriptionList(@protocol(protocolName), 
    YES, YES, &numOfMethods)

数组中的描述数量现在存储在 numOfMethods 变量中。然后,您可以迭代此数组,并使用 == 检查每个方法的选择器是否等于当前选择器,而不是将选择器转换为字符串:

for (int i=0; i<numOfMethods; i++) {
    if (aSelector == method_description_list[i].name) 
        //forward to other delegate
    else
        return [super forwardingTargetForSelector:aSelector];
}

请注意,使用完毕后,您需要执行 free(method_description_list) 来回收它占用的内存。

每次调用 forwardingTargetForSelector: 时都没有必要重新创建和释放它,因此您可能需要执行一些操作,例如将其转换为 iVar 并在 init 中创建它>,然后在 dealloc释放它,因为协议(protocol)在该对象的生命周期内不太可能改变

关于ios - 如何判断一个选择器是否包含在objc中的一个协议(protocol)中?谢谢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29536651/

相关文章:

iOS 在拖动端点时调整大小或重新定位线

ios - 使用 NSFetchedResultsController 即时创建部分

objective-c - 使用 Objection 时,自定义协议(protocol)的实现因无法识别的选择器而崩溃

ios - UITabBarController viewControllers 奇怪的行为

ios - 使用按钮索引以编程方式从 uiactionsheet 截取屏幕截图

ios - Swift ExpressibleByIntegerLiteral - 它究竟是如何工作的?

ios - 使 NSTimer 失效

ios - Swift:将条件和 if-let 与逻辑或结合起来

iphone - UIView位置检测

ios - 使用固定的 UIView 页眉和页脚构建父 UIViewController。调整在页眉和页脚中继承 UIViewControllers 内容?