这种情形,会不会死循环呢?


#1

在同一个Tweak.xm中,如果存在下面情形,会死循环吗?

%hook AAA
	-(void)writeFile
	{
	   [BBB  testFile];
	   %orig;   
	}
%end


%hook BBB
	-(void)testFile
	{
	   [AAA writeFile];
	   %orig;
	}
%end

各位老师帮解答一下,谢谢.


#2

首先你这个肯定会报错吧 ,,不考虑报错的情况下 这个是个死循环 相当于while(1){}


#3

先不考虑报错情况,
如果会造成死循环的话,

那如果,同一个Tweak.xm 中,HOOK多个类,多个方法时,如果中间多个类的方法中,如果存在
相互调用的情况,那HOOK岂不会造成混乱呢?

比如,HOOK了 %hook NSString 这个类的isEqualToString 让他一直反回false ,
此时,恰恰同一个Tweak中,hook b 中的,xx方法,调用了isEqualToString 方法,
此时,将一直反回 false ???!!!!

相当混乱呀


#4

不冲突啊,


#5

每个hook就相当于一个独立的 运行的 他是走进程的 是按代码顺序走 不存在混乱的 。至于你说的一直返回false 对啊 一直返回false 没毛病


#6

这问题试一下不就好了


#7

此时,如果我想,

hook b 中的,xx方法,调用了isEqualToString 方法时,如果,我想不受影响,有没有方法呢?谢谢。


#8

做判断 具体怎么做 可以在你传的字符串的前面或者后面拼接特殊的字段 , 判断那边取字段 有的就返回正常结果 没有直接false


#9

明白,多谢多谢


#10

你自己写个demo试试就好了


#11

注意demo不要注入SpringBoard


#12

明白了,多谢老大


#13

你 hook 了实例方法,里面调的是类方法。。应该会抛异常吧。

你可以用关联对象给这个对象加个标记,然后 hook 代码里判断是否有这个标记来决定走 false 还是原实现。

再或者用 dyld 判断上一层调用栈地址在不在插件里,来决定走哪个逻辑。