美文网首页
Runtime了解?说下项目中什么地方用到Runtime?

Runtime了解?说下项目中什么地方用到Runtime?

作者: Peanut_S1 | 来源:发表于2019-08-13 15:16 被阅读0次

    OC利用Runtime运行时变成一门动态语言

    Runtime中的可以解决的问题:
    1.为分类增加属性
    常规定义 @property,编译器会为我们做3个处理:
    生成实例变量_ property
    生成getter和setter
    但是分类中并不会去帮我们实现这些,所以通过关联对象去将键值关联到对象上面去
    示例代码如下:

    @property (nonatomic, strong) NSString *title;

    • (NSString *)title {
      return objc_getAssociatedObject(self, _cmd);
      }

    • (void)setTitle:(NSString *)title {
      objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_RETAIN);
      }
      2.实现方法交换
      在不想原有的功能下增加一些特殊的功能
      3.利用class_copyIvarList 实现NSCoding的归档和解归档
      class_copyIvarList 此方法可以获取对象中的成员列表变量,然后利用KVO来实现encodeWithCoder、initWithCoder这两个方法

    4.不仅如此,还可以实现消息消息转发的机制
    oc 通过obj_message的方式发送消息的,当对象收到无法处理的消息的时候,会执行消息转发,转发的步骤如下:
    1.调用resolveInstanceMethod 方法,实现动态方法解析。这里会给类使用class_addMethod 来增加方法的机会。
    2.如果没有实现动态方法解析,可调用 forwardingTargetForSelector 方法,看是否有备用接收者,将消息转发给备用接收者处理。
    3.如果没有对象来接受此消息,处理不了了,就转发出去。
    调用 methodSignatureForSelector 和 forwardInvocation 方法,进行完成的消息转发

    如果经过上面三个步骤,还不能正确处理消息,程序就会走 doesNotRecognizeSelector 方法,crash 掉。

    相关文章

      网友评论

          本文标题:Runtime了解?说下项目中什么地方用到Runtime?

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