认识Runtime1
2015-08-16 20:47
253 查看
认识Runtime1
什么是id?
id在objc.h中的定义如下:typedef struct objc_object *id;
那么什么是objc_object呢?
objc_object在objc.h中的定义如下:
struct objc_object { Class isa; }
这个时候我们知道Objective-C中的object最后被转化成了C的结构体,而在这个struct种只有一个isa指针,指向它的类别Class.
那么什么是Class 呢?
在objc.h中定义如下:
typedef struct objc_class *Class;
我们可以看懂Class本身指向的也是一个C的struct objc_class.
我们看一下runtime.h中objc_class的定义如下:
struct objc_class { Class isa OBJC_ISA_AVAILABILITY, #if !_OBJC@_ Class super_class OBJC2_UNAVAILABLE;//父类 const char *name OBJC2_UNAVAILABLE;//类名 long version OBJC2_UNAVAILABLE; //类的版本信息,默认为0 long info OBJC2_UNAVAILABLE; //类信息,供运行期间使用一些位标识 long instance_size OBJC2_UNAVAILABLE; //该类实列变量的大小 struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; //该类的成员变量链表 struct objc_method_list **methodLists OBJC2_UNAVAILABLE; //方法定义的链表 struct objc_cache *cache OBJC2_UNAVAILABLE;//方法缓存 struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; //协议链表 #endif }OBJC2_UNAVAILABLE;
isa指向类的本身
cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。实际中,对象只有一部分方法是常用的,很多方法其实根本不用。这样,如果每次消息来时,我们都是在methodLists中遍历一遍,性能肯定会很差。这时cache就盼上用场了。每次调用过一个方法之后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果没有才去methodLists中查找方法,这样对于经常用到的方法的调用,提高了调用效率。
在OC中,一切都是对象,Class在设计的本身也是一个对象。而这个Class对象对应的类,我们叫他Meta Class.即Class结构体中的isa指向就是他的元类。
Meta Class
我们可以把Meta Class理解为一个Class对象的Class.简单的说:当我们发送一个消息给一个NSObject对象时,这条信息会在对象的类方法列表里面查找。
当我们发送一个消息给一个类时,这条消息会在Meta Class的方法列表里查找。
附:
参考自:http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and-class-and-meta-class/
http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/
相关文章推荐
- ntfs mount fail after upgrade win10
- ORACLE 10g 安装教程[图文]
- HDU 5301(Buildings-贪心构造)
- HDU 5391 Zball in Tina Town
- iOS概念入门学习-Foundation-NSArray
- 设置电脑分屏显示的4种情况
- c++类占用的内存空间
- URL的结构介绍
- 我的创业经历
- html5中的clip
- Ubuntu14.04下安装 Jlink 往S3C2440 开发板下载程序过程的 安装、使用
- CCF题目:Z字形扫描
- Android中的样式和主题(Styles and Themes)
- 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动
- String系列简介
- 浅析Spring事务传播行为和隔离级别
- poj 3683 2-sat
- TCP/IP详解 卷I:协议 のFAQ
- 不用js实现背景图片的切换
- getline(),cin.getline(),cin.get()区别