最近在做一个功能时想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>里还有很多协议相关方法,了解里面的方法,将来开发或者会有新的思路
文章有什么错误纰漏地方请指出,谢谢!
网友评论