架构师之路iOS开发Objective-C

Runtime系列(Method Swizzling)

2015-08-30  本文已影响1293人  01_Jack

前言

记得《大话西游2》中有这么个桥段,紫霞仙子和猪八戒中招移魂幻影大法后灵魂互换,当时看的也是泪流满面。。而Method Swizzling就是传说中的移魂幻影大法!身体还是那个身体,但是灵魂已被互换,同样的身体言行举止都变成被换对象。

正文

Mthod Swizzling.png

代码很好理解,如果还在想为什么不会陷入死循环,是时候重温这部经典影片了。

如果交换后再交换呢?

交换两次.png

显然,偶数次交换后方法的实现不变

说一下使用Method Swizzling的几个注意点:

既然+ (void)load只会调用一次,为什么还要加dispatch_once

如果swizzle写在+ (void)load是不是就不用加dispatch_once了,因为不涉及并发,而且+ (void)load不是只会调用一次么?load是系统在调,但同样支持手动调用,为防止特殊情况发生,加dispatch_once总没错。

写在最后

更好的写法是,在load的dispatch_once内部末尾加上这段代码

附加代码.png

让我们先来搞清楚这段代码究竟是在做什么:
第一句是添加IMPswizzlingMethod到SELoriginSel中(只是添加,不会覆盖orginSel的原有实现),当且仅当originSel为当前类的父类方法时才能添加成功。如果添加成功将SELswizzlingSel的实现用原有的IMPoriginMethod覆盖,关系如下:

关系图.png

这是一种变相的swizzle。

上一篇下一篇

猜你喜欢

热点阅读