当前位置:   article > 正文

iOS黑魔法-- Method Swizzle

method swizzle

Method Swizzle

目前method swizzle已经用了很长时间了,从线上的表现来看,这是一个非常有必要的工具,可以很好的拦截一些脏数据或者我们的不慎造成的一些常见的崩溃,所以笔者记录分享一些这些方法。

AOP

首先我们先要抛开OOP(面向对象编程)的观念,从AOP(Aspect Oriented Programming,面向切面编程)的角度来封装一系列swizzle方法,以方便我们后面的方法替换。这里注意:OOP、AOP都是一种编程的思想。OOP编程思想更加倾向于对业务模块的封装,划分出更加清晰的逻辑单元;而AOP是面向切面进行提取封装,提取各个模块中的公共部分,提高模块的复用率,降低业务之间的耦合性。
OC中利用可以利用我们今天的主角Method Swizzle来实现AOP。Method Swizzle的主要作用就是在运行时把一个方法的实现替换成另一个方法的实现,这就是我们常说的iOS黑魔法。此外因为OBJC_API_VERSION版本的不同,以及需求的不同,对Method Swizzle的封装是很有必要的,比如说你要用一个block来替换一个方法的实现,并不是我们常用的method之间的替换,再比如OC的底层runtime库若发生了什么变动,我们也可以用很小的代价进行替换。
这里就给大家介绍一个好用的对Method Swizzle进行封装的库:jrswizzle,笔者也是用的这个库,目前来看效果很好。githud地址

下面我简单的介绍一下为什么可以闭替换方法的实现?首先之前的博客中也提到过,OC是消息转发机制,采用的是消息结构而非函数的调用。消息机制的特点就是直到运行时才能决定方法的实现,OC采用SEL-Method映射的关系,在运行时有SEL找到其对应的方法实现。利用这个机制我们可以轻松的替换SEL对应的Method。下面贴出一张图类解释:
这里写图片描述

理解了Method Swizzle的原理以及封装你就可以尽情的对你需要拦截的方法进行拦击了,常见的有字符串,数组,字典,未识别方法等等,这些在后面的博客中笔者会一一介绍。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/531534
推荐阅读
相关标签
  

闽ICP备14008679号