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 ? ? ? 人的记忆能力是有限的,分析、建模与解释能力是无限的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET – 如何引用不在app_code中的类
- 在ASP.NET中运行代码的绝对最早的地方的执行顺序
- 如何在ASP.NET中最好地填充HTML表?
- asp.net – 嵌套的Repeater和SqlDataSource参数
- asp.net-mvc – 在MVC3中扩展ClaimsIdentity
- asp.net – 通过VB.NET将click事件添加到按钮以激活javascr
- ASP.Net核心 – 获取帖子表格的所有数据
- asp.net – 网站无法启动另一个网站可能使用相同的端口
- asp.net-mvc – Ajax重定向到页面而不是更新目标
- entity-framework – 序列化时如何忽略导航属性
- asp.net – 如何访问listview中的按钮?特别是使
- asp.net-mvc-4 – MVC 4捆绑URL而不是文件
- 有条件地排除ASP.NET WebForms中的一个HTML块
- 实现ASP.NET MVC的自定义登录
- 我如何在ASP.Net Web窗体中模拟/伪造会话对象?
- asp.net-mvc – 是否可以手动更新ModelState.IsV
- asp.net-mvc – 从.Net MVC View获取HTML而不实际
- asp.net – .net http处理程序重定向到rtmp和fle
- ASP.NET中的XMPP支持
- asp.net-mvc – AppHarbor的反向代理导致SSL和ap