美文网首页
iOS 获取协议中的全部方法

iOS 获取协议中的全部方法

作者: 古德猫宁K | 来源:发表于2021-04-20 11:26 被阅读0次

最近在做一个功能时想hook一个对象的协议的全部方法,但其他方法不hook,遂有了获取协议全部方法的想法。

1.导入头文件#import <objc/runtime.h>

#import <objc/runtime.h>

2.在这个runtimer头文件里,有个方法protocol_copyMethodDescriptionList

/** 
 * 返回值是一个数组
 * 
 * @param 第一个参数是否是required
 * @param 第二个参数是否是对象方法
 * @param 返回的数组有多少个元素
 * 
 * @return 返回数组是一个结构体的数组
 */
OBJC_EXPORT struct objc_method_description * _Nullable
protocol_copyMethodDescriptionList(Protocol * _Nonnull proto,
                                   BOOL isRequiredMethod,
                                   BOOL isInstanceMethod,
                                   unsigned int * _Nullable outCount)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

3.使用方法,以UITableViewDataSource为例

unsigned int count = 0;
    struct objc_method_description  * desc = protocol_copyMethodDescriptionList(NSProtocolFromString(@"UITableViewDataSource"),
                                       NO,
                                       YES,
                                       &count);
    for (int i = 0; i < count; i++) {
        struct objc_method_description temp = desc[i];
        NSLog(@"%@", NSStringFromSelector(temp.name));
    }
    free(desc);

4.打印结果,isRequiredMethod = NO 时将打印以下结果(删掉了无关内容)

numberOfSectionsInTableView:
tableView:titleForHeaderInSection:
tableView:titleForFooterInSection:
tableView:canEditRowAtIndexPath:
tableView:canMoveRowAtIndexPath:
sectionIndexTitlesForTableView:
tableView:sectionForSectionIndexTitle:atIndex:
tableView:commitEditingStyle:forRowAtIndexPath:
tableView:moveRowAtIndexPath:toIndexPath:

isRequiredMethod = YES 时将打印以下结果

tableView:numberOfRowsInSection:
tableView:cellForRowAtIndexPath:

5.结语

demo就不传了,就上面第三段的代码,粘贴到viewDidLoad跑一下就可以了。在#import <objc/runtime.h>里还有很多协议相关方法,了解里面的方法,将来开发或者会有新的思路

文章有什么错误纰漏地方请指出,谢谢!

相关文章

网友评论

      本文标题:iOS 获取协议中的全部方法

      本文链接:https://www.haomeiwen.com/subject/aooglltx.html