首页 > 代码库 > 关于 iOS RunTime 使用的一些场景

关于 iOS RunTime 使用的一些场景

1、RunTime 简介:

      RunTime 在 OC 中的工作:OC 语言的设计模式决定了尽可能的把程序从编译和链接时推迟到运行时。只要有可能,OC 总是使用动态的方式来解决问题。这意味着 OC 语言不仅需要一个编译器,同时也需要一个运行时系统来执行编译好的代码。这儿的运行时系统扮演的角色类似于 OC 语言的操作系统,OC 基于该系统来工作。

 

2、RunTime 常用场景:

  1、动给属性赋值:

    例如我先创建一个 Student 对象,里面定义两个属性:name、age 下面看截图

    技术分享

    这个时候运行打印出来的 name 就是 “李四” 了。

  2、动态关联属性:

    动态关联一般是在给 OC 原生类添加类目(Category)并且要给类目添加属性的时候,用到动态关联,我们知道:类目是不能直接添加属性的(具体为什么不能,可以百度,这里重点讲解动态关联,不做过多解释),只能通过动态关联操作来达到目的,下面给出例子:

    例如给 UILabel 增加类目,头文件如下:

    技术分享

    .m 实现文件如下:

    技术分享

    然后在 controller 中引  #import "UILabel+Name.h" 头文件,这样在 controller 中写如下代码:

    技术分享

    这个时候运行,便能打印出来: “123456”。在 UILabel+Name.m 中实现的两个方法就是动态关联属性的 getter 和 setter 方法,必须要实现这两个方法,否则运行直接崩溃。

    3、Method Swizzling 运行时动态交换方法:

     代码示例如下:

    技术分享

    这个时候调用 eat 方法,会打印 “222222222222222222” , 而调用 run 方法则会打印 “111111111111111” 出来,很神奇吧,这个时候就已经实现了在RunTime的时候动态交换方法。

3、总结:

  这里只讲解这几种常用的场景,当然还有:像 OC 的消息转发机制也是基于 RunTime 来实现的,具体场景还需要读者自己去应用,RunTime 对于初学 iOS 者,可能并不常见,但是随着学习的深入,这种机制是一定要理解的,而且一些复杂的应用场景也经常会用到。

  

关于 iOS RunTime 使用的一些场景