zoukankan      html  css  js  c++  java
  • aspect原理分析

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

    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

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

  • 相关阅读:
    常量与变量
    BandicamPortable破解软件的按照和设置
    普罗米修斯监控马哥亲自讲解
    为什么需要监控,在哪些层次上监控,监控什么
    prometheus比zabbix好在哪点?
    聊一聊几款流行监控系统,你知道几个?
    监控系统选型看这一篇够了!选择 Prometheus 还是 Zabbix ?
    DNS详细解析问题
    洛谷 P4025 [PA2014]Bohater(贪心)
    洛谷 P1842 [USACO05NOV]奶牛玩杂技(贪心)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11678969.html
Copyright © 2011-2022 走看看