——————————————————【我眼中的 OC - Runtime】——————————————————
一、RunTme是什么
(一)RunTime
1.(封装)
简单的说,是实现OC语言的C库,对象用C中的结构体表示,方法methods可以用C函数实现,再加上些额外的特性,被Runtime统统封装后,OC可以在程序运行时创建,查看,修改类和他们的方法。具体点说,就是看OC怎么用C语言实现的。。
2.(找出方法最终执行行代码)
一条消息(message)发送给对象(接受者),runtime库会让对象根据消息决定作出什么样的反应
3.里面有很多runtime库,自省检查和消息接受
(二)动态创建类
Key - Value Observing
调用objc_duplicateClass方法完成。方法不公开
使用s object_setClass()创建新类,(原来的类和新的类必须有相同的成员变量的布局)成员变量通过runtime访问,修改某个对象的类,科恩能够导致runtime无法找到对应的变量
(三)创建对象
给实例变量存储区域多分配一点额外的空间,为了获取这块空间起始指针(用 object_getIndexedIvars),然后就可以索引实例变量(ivars)。创建对象了
(四)消息派发
可以运行时再决定方法,将消息转发给其他对象,或发出异常。
runtime不需要知道Foundation。runtime会让程序定义转发函数(forwarding function),当 objc_msgSend()无法找到该selector的实现时,那个转发函数就会被调用。程序一启动,CoreFoundation就将 -forwardInvocation:定义成转发函数。
二、RunTime能做什么?
(一)KVC中setValue - Crash - Ivar - class_copyIvarList
(二)动态创建函数 class_addMethod
(三)替换已有函数 class_replaceMethod
(四)动态挂载 objc_setAssociatedObject
——————————————————————————————————
最后要感谢 Anselz’s 于2014年5月发表的两篇关于Runtime的博客技术分享
——————————————————————————————————