美文网首页iOS底层原理
Method Swizzle实际使用的坑

Method Swizzle实际使用的坑

作者: 轻重缓急 | 来源:发表于2019-06-02 19:36 被阅读83次

        method swizzle又被称为黑魔法,它是苹果公司给Objective-C赋予的神奇方法,同时也是Runtime应用的具体体现。黑魔法使用得好,会使你的开发更加方便,但使用不当,会产生一些意想不到的问题。好了,下面说一说,在具体使用的一些坑:

1、在load方法中交换方法时未能保证只交换一次,如下图:

未保证只交换一次 交换方法的实现

这种写法在通常情况下,方法交换是没有问题的,不会出现什么意外,但是,一旦在多人共同开发一个项目的时候,或者有小白型开发者加入到开发中,在某个地方不小心又主动调用了load方法,哈哈,那么就会出现一些不可预测的事情了。为什么呢?大部分iOSer都知道原因的,在这里就略过了,为了防止这种情况的出现,使用dispatch_once让方法交换只会发生一次,如下图:

保证只执行一次

2、子类没有实现父类的方法,却在子类中交换了父类的方法。此时大家觉得会出问题吗?项目运行后,调用交换后的方法,汇报如下的错误:

那该如何解决呢?其实问题是出在:子类里面没法找到该方法的实现。既然这样,在交换的时候,先尝试给子类本身添加要交换的方法,然后再将父类的IMP给swizzle。具体实现代码如下:

3、交换的方法,在子类和父类中都没有实现。那么,第二种情况的解决方案还试用吗?答案是不适用的。会陷入递归调用中。这时,如下图:

方法交换不成功,此时就会出现:helloword(SEL) -->xt_studentInstanceMethod(IMP),而由于helloword(IMP)并不存在,从而使得,xt_studentInstanceMethod(SEL)-->xt_studentInstanceMethod(IMP)还是存在的,所以就会出现递归调用问题。为了解决这个问题,那就自己手动实现添加一个IMP,来打破递归调用。具体代码如下图:

总结:这只是自己在实际开发中遇到的问题的总结,难免会有不恰当的地方,欢迎各位iOSer指出问题,大家共同进步。同时,附上相关的代码:Method Swizzle

相关文章

  • Method Swizzle实际使用的坑

    method swizzle又被称为黑魔法,它是苹果公司给Objective-C赋予的神奇方法,同时也是R...

  • iOS Method Swizzle 源码分析

    iOS Method Swizzle 代码 平常我们用的方法都是method_exchangeImplementa...

  • Method Swizzle

    1、AOP编程思想 1.1、AOP是什么 AOP(Aspect Oriented Programming)直译为面...

  • Method Swizzle

    在Swift中也可以用Objective-C运行时来进行Swizzle, 如果想在一个app中监听所有的点击事件,...

  • method swizzle

  • Method Swizzle

    1.每个类里有一个dispatch table,将方法的名字(SEL)跟方法的实现(IMP:指向函数的指针)一...

  • iOS 黑魔法之Method-Swizzling

    Method-Swizzle Method Swizziling 是OC运行时给我们的用于交换Method的实现方...

  • 2018-01-08

    void Swizzle(Class c, SEL origSEL, SEL newSEL) { Method o...

  • iOS Swizzle Method

    1.实例方法交换 2.类方法交换 3.class一点总结 项目地址:https://github.com/hkkh...

  • iOS Swizzle method

    在理解这一套东西之前,我们先理清楚几个函数的意义 1.class_addMethod(aClass, origin...

网友评论

    本文标题:Method Swizzle实际使用的坑

    本文链接:https://www.haomeiwen.com/subject/rwitxctx.html