BNRHookAction
- 根据字典 hook 的调用方法,先执行传人的 block,然后再执行原函数,从而实现无侵入式打点;
- 根据字典 hook 的调用方法,只执行您传入的 block,不调用原函数
注意事项
不支持为父类和子类同时 hook 同一个函数(如 A 是父类,A1 和 A2 是子类,A1 实现了
viewWillAppear:
,A2 未实现,同时 hook A 的viewWillAppear:
和 A1 的viewWillAppear:
会造成死循环;同时 hook A1 和 A2 的viewWillAppear:
也会造成调用死循环,实际上 A2 未实现viewWillAppear:
,hook A2 时,就是 hook 的 A 的viewWillAppear:
。如果子类不调用 [super method] 是不会造成调用死循环的。)
hook 函数时,请确保 hook 的 target 实现了 hook 的 action,而不是父类实现了这个 action。
引入
pod 'BNRHookAction'
使用
该方法根据您传入的 recordDic
,先调用 block,再调用原函数
[[BNRHookAction shareInstance]
setRecordDic:recordDic
andHookBlock:^(
NSString *target,
NSString *action,
NSDictionary *handleDic,
NSDictionary *params) {
NSLog(@"hook %@",action);
}];
该方法根据您传入的 recordDic
,只调用 block,不会再调用原函数
[[BNRHookAction shareInstance]
setRecordDic:recordDic1
andWithOutCallOriginFuncHookBlock:
^void *(NSString *target,
NSString *action,
NSDictionary *handleDic,
NSDictionary *params) {
if (...)
{
//根据block的参数,执行特定的代码,
//原函数可能会有返回值,您可以在这里修改
//原函数的返回值
}
return nil;
}];
参数说明
-
recordDic
{"ClassName1":{ "actionName1":{ "key1":"value1"; "key2":"value2"}; "actionName2":{ "key1":"value1"; "key2":"value2"} }; "ClassName2":{ "actionName1":{ "key1":"value1"; "key2":"value2"}; "actionName2":{ "key1":"value1"; "key2":"value2"} } }
想要