一、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.
网友评论