美文网首页
王者之路(钻石)——iOS底层Runtime运行时简单认识(二)

王者之路(钻石)——iOS底层Runtime运行时简单认识(二)

作者: 无名感恩 | 来源:发表于2018-04-15 18:30 被阅读0次

    一、Runtime 举例--高大上的叫法:Method Swizzling  实际就是 IMP和SEL进行交换,通俗来说SEL相当于目录、IMP相当于页码,我们查找书的目录的时候,如果交换了页码,就会出现A目录 会执行B页码的方法。

    第一步:简单写个小例子。

    我们很容易看出来 URL是不存在的,但是OC中NSURL这个类 不会检测nil,这样给我们开发会带来很多麻烦。我就想能不能让NSURL去检测呢?

    第二步:解决的办法就是写NSURL的Category 来代替这个方法。

    然后把URLWithString换成XL_URLWithStr 就可以了。

    第三步:目前来说,还是不够完美,每一个地方都要换成xl这个,我想还是用系统的URLWithString  但是我要执行XL_URLWithStr里面的方法。(神奇了吧 😄)

    现在就交换了方法的实现,但上面代码还有问题。就是会造成死循环,执行URLWithString就会调用自己,不停的调用自己。

    解决方法就是:

    这样就完美解决了问题。

    二、runtime实例--动态添加方法

    首先调用一个类 不存的方法。

    然后

    就这么BUG  ,然后就成功动态添加了一个方法eat。

    然后我又试了一下传值:

    如果不写那2个隐式参数,打印的str 是看不懂的一串,我也是经过了各种百度 才发现这个。

    总结一下:在调用oc方法时候,会给IMP传入2个参数,方法的调用者 id self、方法的编号SEL _cmd.

    相关文章

      网友评论

          本文标题:王者之路(钻石)——iOS底层Runtime运行时简单认识(二)

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