首页 > Web开发 > 详细

aspect原理分析

时间:2019-10-15 18:21:51      阅读:107      评论:0      收藏:0      [点我收藏+]

人的记忆能力是有限的,分析、建模与解释能力是无限的

 

Call Hierarchy

 

isa hook

   aspect_hookClass()

      aspect_prepareClassAndHookSelector()

         aspect_add()

            +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

               +[NSURLCache load]

 

解释系统重定向

aspect_swizzleForwardInvocation()

   aspect_hookClass()

      aspect_prepareClassAndHookSelector()

         aspect_add()

            +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

               +[NSURLCache load]

 

 

(解释)转发系统重定向

aspect_getMsgForwardIMP()

   aspect_prepareClassAndHookSelector()

      aspect_add()

         +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

            +[NSURLCache load]

 

 

// We use forwardInvocation to hook in.

        class_replaceMethod(klass, selector, aspect_getMsgForwardIMP(self, selector), typeEncoding);

 

 

整体原理

上面讲了几种消息转发的方法,Aspects主要是利用了forwardInvocation进行转发,Aspects其实利用和kvo类似的原理,通过动态创建子类的方式,把对应的对象isa指针指向创建的子类,然后把子类的forwardInvocation的IMP替成__ASPECTS_ARE_BEING_CALLED__,假设要hook的方法名XX,在子类中添加一个Aspects_XX的方法,然后将Aspects_XX的IMP指向原来的XX方法的IMP,这样方便后面调用原始的方法,再把要hook的方法XX的IMP指向_objc_msgForward,这样就进入了消息转发流程,而forwardInvocation的IMP被替换成了__ASPECTS_ARE_BEING_CALLED__,这样就会进入__ASPECTS_ARE_BEING_CALLED__进行拦截处理,这样整个流程大概结束。

 

https://www.jianshu.com/p/0d43db446c5b

 

 

 

人的记忆能力是有限的,分析、建模与解释能力是无限的

aspect原理分析

原文:https://www.cnblogs.com/feng9exe/p/11678969.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!