method-swizzling 是什么? method-swizzling的含义是方法交换,其主要作用是在运行时将一个方法的实现替换成另一个方法的实现,这就是我们常说的iOS黑魔法, 在OC中就是利用method-swizzling实现AOP, aIMP 指向 bIMP,但是bIMP不一定指向aIMP method_exchangeImplementations:交换两个方法的实现,即 aIMP -> bIMP, bIMP -> aIMP 坑点1:method-swizzling - 类方法 类方法和实例方法的method-swizzling的原理是类似的,唯一的区别是类方法存在元类中,所以可以做如下操作 LGStudent中只有类方法sayHello的声明,没有实现 @interface 的应用 method-swizzling最常用的应用是防止数组、字典等越界崩溃 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇,一个NSArray的实现可能由多个类组成
所以这个时候 AOP 就可以完美的解决这个问题,对于 OC 来说,我们可以直接 Method-Swizzling 来 Hook 当前的 viewWillAppear 和 viewWillDisappear 但是这种简单的 Method-Swizzling 其实存在一定的安全隐患。 Aspects 是一个使用简单的 AOP 库,适用于 iOS 和 OS X。
www.tingyun.com/ 国内听云 http://www.oneapm.com/ 国内OneAPM http://apm.netease.com/ 国内网易 国外资料 http://nshipster.com/method-swizzling abhimuralidharan/method-swizzling-in-ios-swift-1f38edaf984f https://darkdust.net/writings/objective-c/method-swizzling iossolves.blogspot.com/2017/11/swift-4-method-swizzling-part-22.html https://sexyswift.wordpress.com/tag/method-swizzling
利用runtime , method-swizzling 黑魔法,交换方法,通过改变我们原始的方法的IMP的指向.指向我们要处理正确逻辑的函数实现.这样的方式,还可以用作来页面统计,接口记录,方法记录!
感兴趣的同学可以看看我之前这篇文章:《Swift进阶之内存模型和方法调度》 Initializers 通常,我们会在+load方法中进行method-swizzling,这也是Nshipster推荐的方式 不少同学喜欢用method-swizzling来实现AOP去做日志统计等内容,强烈建议改为在initialize进行初始化。
三、Runtime 可以说是中级以及以上工程师的必备技术要求,面试官往往会考察大家对对象、类对象、原类对象的理解、消息传递机制、消息转发流程、Method-Swizzling、ISA-swizzling
objc_getClass("NSTaggedPointerString") superclass] before iOS8:NSObject after iOS8:NSString 以上这些实现的调整,造成的影响均是 method-swizzling 排查搜索之后,发现这可能是在 ARC 环境下,苹果对 dealloc 方法的特殊处理导致的,在 method-swizzling 后,原 dealloc 的 selector 实际上已经变成了转发后的
KVO运用了一个isa-swizzling的机制,runtime还有一个method-swizzling的机制,称为’黑魔法’。
3.2 技术原理 3.2.1 Method-Swizzling OC 中的方法调用其实是向一个对象发送消息 ,利用 OC 的动态性可以实现方法的交换。
接下来的源码中有一部分关于method-swizzling的技术,这一部分由于篇幅问题不打算展开讲解,_AFURLSessionTaskSwizzling类存在的目的就是为了交换NSURLSessionTask 的resume和suspend方法的实现,因为iOS7和iOS8中NSURLSessionTask的父类不同,需要做一些处理,关于method-swizzling技术有兴趣的读者可以阅读iOS runtime
MethodSwizzling http://southpeak.github.io/blog/2014/11/06/objective-c-runtime-yun-xing-shi-zhi-si-:method-swizzling
stackoverflow.com/questions/5371601/how-do-i-implement-method-swizzling Method Swizzling http://nshipster.com/method-swizzling