iOS 如何实现 Aspect Oriented Programming (下)

390 查看

111194012-362f68c0c95d15f4

(接上篇)

五. Aspects hook过程详解

先看看函数调用栈的情况

从调用栈可以看出,Aspects hook过程主要分4个阶段,hookClass,ASPECTS_ARE_BEING_CALLED,prepareClassAndHookSelector,remove。

121194012-f5d728cf23df4d91
1. hookClass

statedClass 和 baseClass是有区别的的。

statedClass 是获取类对象,baseClass是获取到类的isa。

先判断是用来className是否包含hasSuffix:AspectsSubclassSuffix

如果包含了@”_Aspects_”后缀,代表该类已经被hook过了,直接return。
如果不包含@”_Aspects_”后缀,再判断是否是baseClass是否是元类,如果是元类,调用aspect_swizzleClassInPlace。如果也不是元类,再判断statedClass 和 baseClass是否相等,如果不相等,说明为KVO过的对象,因为KVO的对象isa指针会指向一个中间类。对KVO中间类调用aspect_swizzleClassInPlace。