在同一个Tweak.xm中,如果存在下面情形,会死循环吗?
%hook AAA
-(void)writeFile
{
[BBB testFile];
%orig;
}
%end
%hook BBB
-(void)testFile
{
[AAA writeFile];
%orig;
}
%end
各位老师帮解答一下,谢谢.
在同一个Tweak.xm中,如果存在下面情形,会死循环吗?
%hook AAA
-(void)writeFile
{
[BBB testFile];
%orig;
}
%end
%hook BBB
-(void)testFile
{
[AAA writeFile];
%orig;
}
%end
各位老师帮解答一下,谢谢.
首先你这个肯定会报错吧 ,,不考虑报错的情况下 这个是个死循环 相当于while(1){}
先不考虑报错情况,
如果会造成死循环的话,
那如果,同一个Tweak.xm 中,HOOK多个类,多个方法时,如果中间多个类的方法中,如果存在
相互调用的情况,那HOOK岂不会造成混乱呢?
比如,HOOK了 %hook NSString 这个类的isEqualToString 让他一直反回false ,
此时,恰恰同一个Tweak中,hook b 中的,xx方法,调用了isEqualToString 方法,
此时,将一直反回 false ???!!!!
相当混乱呀
不冲突啊,
每个hook就相当于一个独立的 运行的 他是走进程的 是按代码顺序走 不存在混乱的 。至于你说的一直返回false 对啊 一直返回false 没毛病
这问题试一下不就好了
此时,如果我想,
hook b 中的,xx方法,调用了isEqualToString 方法时,如果,我想不受影响,有没有方法呢?谢谢。
做判断 具体怎么做 可以在你传的字符串的前面或者后面拼接特殊的字段 , 判断那边取字段 有的就返回正常结果 没有直接false
明白,多谢多谢
你自己写个demo试试就好了
注意demo不要注入SpringBoard
明白了,多谢老大
你 hook 了实例方法,里面调的是类方法。。应该会抛异常吧。
你可以用关联对象给这个对象加个标记,然后 hook 代码里判断是否有这个标记来决定走 false 还是原实现。
再或者用 dyld 判断上一层调用栈地址在不在插件里,来决定走哪个逻辑。