关于Runtime-小记

 

 

定义

 Runtime,是一套C++汇编编写的API,将数据类型的确定由编译期推迟到运行时。本质就是消息(方法)发送(objc_msgSend)。

作用

Runtime为OC提供运行时功能。由于OC语言运行时的特性,所以不只依赖编译器,还需要依赖运行时的环境。

机制

当一个对象被调用时,首先在对象所属的类中查找,如果没有则向父类查找,一直找到根类NSObject,如果实在找不到,则进入消息转发。如果转发也没找到,则报crash。

与Runtime 交互

1.通过object-c源代码;2.通过Foundaction框架中的NSObject类定义的方法。3.通过对Runtime函数的直接调用。

runtime运用场景

1.方法调用:objc_msgSend (如:调用类方法)

1.方法的交换(替换):method_exchangeImplementations(具体应用拦截系统自带的方法调用)。

2.实现给分类增加属性。

3.实现字典的模型和自动转换,判断某个类的子类。

4.动态创建方法。

写的不全,都是项目会用到~

Runtime添加实例变量问题

不能向编译之后得到的类中添加实例变量。

  因为编译后的类已经注册在Runtime中。类结构体中实例变量的链表和实例变量的内存大小已经确定。

可以向运行时创建的类添加实例变量。

  在object_allocateClasspair之后和object_registerClasspair之前,可以在运行时创建的类中添加实例变量。

7.涉及到的概念

类对象,实例,元类,SEL,IMP,类缓存,category。

8.编译时和运行时

编译时:即编译器对语言的编译阶段。编译时只是对语言进行最基本的检查报错,包括词法分析,语法分析等。

       编译成功并不意味着程序就可以成功运行。编译是一个静态的阶段。

运行时:即程序编译之后,编译的代码装载到内存跑起来的阶段。这时会对具体类型进行检查。若此时出错程序会崩溃。

    运行时是动态阶段

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值