objc_class 简介
来源:互联网 发布:ubuntu 界面小应用 编辑:程序博客网 时间:2024/06/06 07:10
首先先来看一下OC中 Class 具体的结构:
typedef struct objc_class *Class;
struct objc_class { Class isa; #if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; 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;
以上可知,Class 本质上是指向objc_class结构体的一个指针,现在我们具体介绍一下结构体中每一个成员所代表的意义。
- isa 表示指向Class类型的指针,实例对象中的isa指向对应的Class类,Class类中的isa指向metaClass
- super_class 指向当前类的父类,如果已经是最顶层的类(NSObject 、NSProxy)super_class为NULL
- name 表示当前类的名字
- version 版本信息
- info 供运行期使用的一些标识信息
- instance_size 实例对象大小
- ivars 所有成员变量数组
- methodList 定义的方法数组
- cache 最近调用方法名称和内存地址相对应的hash缓存表
- 协议数组
我们都知道用id 可以表明指向任何类型的实例对象,本质上id是指向objc_object结构体的指针:
typedef struct objc_object *id;
struct objc_object { Class isa; };
以上可知,我们构造的对象本质就是一个结构体,里面又一个isa指针指向当前对象的类型也就是objc_class
需要注意的是上面的方法列表等都是对应当前类构成的实例变量声明的实例方法,类方法的列表需要根据isa 找到metaClass中的方法列表。
Runtime
上文中objc_class结构体中成员都可以在运行时进行访问。通过isa指针,runtime可以确定具体所要操作的类型,然后runtime提供了一系列的API用来访问其他成员属性。
每个API都有一个前缀来表明操作的对象,针对于实例对象的方法以objc_ 为前缀,针对于类的方法以class_ 为前缀。
阅读全文
0 0
- objc_class 简介
- Objective-C objc_class 介绍
- Objective-C objc_class 介绍
- objc_object 、objc_class、metaclass
- struct objc_class 定义
- What's the methodLists attribute of the structure objc_class for?
- 【objc】基础结构objc_class的布局,老版本vs新版本
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- 简介
- lintcode[612]:k个最近的点
- 看深度学习框架排名第一的TensorFlow如何进行时序预测!
- Linux系统文件类型
- CAS服务集成
- Python shell之清屏
- objc_class 简介
- 前段判断是否验证后提交
- ios-自定义UITextFiled的属性设置
- CCF 历年真题之俄罗斯方块(_1604_2_Tetris.java)参考答案
- linux下could not find or load the qt platform plugin xcb问题
- 简易版之最短距离
- dubbo-admin-2.5.4在tomcat中部署失败的问题
- sql注入
- JAVA学习之旅