美文网首页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实际使用的坑

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