苹果开发笔记

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

2017-11-09  本文已影响0人  iosRn

一、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.

上一篇下一篇

猜你喜欢

热点阅读