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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 利用Runtime实现方法交换 分析场景 在我们的项目开发中,会遇到这样的问题:如果字符串链接里面带有文字,那它...
    杭子_阅读 207评论 0 0
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,841评论 0 9
  • OC方法的本质 首先了解OC方法的本质到底是什么: OC方法由两个部分组成:SEL: 方法编号(一本书的目录编号)...
    w_xiao_wu阅读 391评论 0 1
  • 本文分为4个部分 1.介绍OC和C语言之间的转换 2.介绍运行时和相关术语 3.介绍消息发送机制已及怎样找到函数实...
    一片枫叶随风舞阅读 332评论 0 1
  • 生活就像一盘菜,你往里面放什么佐料,生活就是什么味道。 不管你是米其林三星大厨还是小餐馆不知名的厨师,你都无法做出...
    先锋诗潮阅读 467评论 0 4