美文网首页
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?

    OC利用Runtime运行时变成一门动态语言 Runtime中的可以解决的问题:1.为分类增加属性常规定义 @pr...

  • runtime

    runtime 简介 传说中的 runtime, 从开始接触时就听说.但是很少真正用到.了解了 runtime, ...

  • runtime 的理解及实用

    项目中经常会有一些的功能模块用到runtime,最近也在学习它.对于要不要阅读runtime的源码,我觉得仅...

  • Runtime全面剖析之原理篇

    如果想了解Runtime的实际应用请看Runtime全面剖析之简单使用 一:Runtime简介二: Runtime...

  • 关于Runtime的消息机制

    一.关于runtime 关于runtime一直是开发者津津乐道的问题,之前项目中有个改变全局字体有用到过runti...

  • RunTime的应用和理解

    runtime的理解和应用 项目中经常会有一些的功能模块用到runtime,最近也在学习它.对于要不要阅读runt...

  • Runtime

    这一次的面试过程中,总有面试官问我:你了解 runtime 是什么?你了解 runtime 吗?你在项目中用过 r...

  • Runtime的应用

    Runtime的基本属性和消息转发机制已经介绍过了,下面来了解一些Runtime提供的api在实际项目中的应用。 ...

  • 个人常用Runtime的两种使用方法

    Runtime是OC中的黑魔法。个人在项目中使用到Runtime的地方比较少,主要是以下两种: 1.动态为类添加属...

  • 利用runtime替换系统方法

    对于个人来说,开发中用到runtime的情况很少,而且个人也不建议过多使用runtime甚至滥用runtime,如...

网友评论

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

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