Object-C对象本质
OC中对象类型
-
instance
实例对象isa指针
其他成员变量
-
class
类对象- isa指针
- superclass指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
-
meta-class
元类对象- isa指针
- superclass指针
- 类的类方法信息(class method)
获取对象的方法:
// 实例对象
NSObject * instanceObj = [NSObject new];
// 类对象
Class classClass = [instanceObj class];
Class classClass = object_getClass(instanceObj);
// 元类对象
Class metaClass = object_getClass([NSObject class]);
Class metaClass = objc_getMetaClass([NSStringFromClass([NSObject class]) UTF8String]);
验证是否是元类对象的方法
// NO
BOOL isMetaClass = class_isMetaClass([NSObject class]);
三个对象间的关系:
底层结构
-
查看OC对象结构的方法
-
通过终端指令将
OC
转化为c++
代码:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main_arm64.cpp
下载objc4查看官方源码
-
-
NSObject的本质就是C++中的结构体:
struct NSObject_IMPL { Class isa; };
-
Class
结构,就是objc_class
,继承自objc_object
-
objc_class
结构struct objc_class : objc_object { // 父类 Class superclass; // 方法的缓存。缓存指针和 vtable,加速方法的调用 cache_t cache; // 具体的类信息。存储类的方法、属性、遵循的协议等信息的地方 class_data_bits_t bits; // 存放着当前类的属性、实例变量、方法、协议等等 class_rw_t *data() const { return bits.data(); } void setData(class_rw_t *newData) { bits.setData(newData); } // ....其他方法 }
-
cache_t
结构struct cache_t { // 一个散列表,用来存储 缓存方法的 sel 和 imp struct bucket_t *_buckets; // 有2个作用, // 1: 作为当前可存储的最大容量; // 2: 作为掩码,取已缓存方法在 _buckets 中的下标 mask_t _mask; uint16_t _flags; // _buckets 中 已缓存的方法数量 uint16_t _occupied; // ...其他方法 } struct bucket_t { // 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号 explicit_atomic<SEL> _sel; // 一个函数指针,保存了方法的地址 explicit_atomic<uintptr_t> _imp; }
-
class_data_bits_t
的核心代码是:class_rw_t* data() const {}
-
class_rw_t
结构struct class_rw_t { // 不可变属性内容 const class_ro_t *ro() const {} // 方法列表 const method_array_t methods() const {} // 属性列表 const property_array_t properties() const {} // 协议列表 const protocol_array_t protocols() const {} }
-
class_ro_t
结构struct class_ro_t { uint32_t flags; uint32_t instanceStart; // 实例对象占用的内存空间 uint32_t instanceSize;#ifdef __LP64__ uint32_t reserved;#endif union { const uint8_t * ivarLayout; Class nonMetaclass; }; // 类名 explicit_atomic<const char *> name; void *baseMethodList; protocol_list_t * baseProtocols; // 成员变量列表 const ivar_list_t * ivars; const uint8_t * weakIvarLayout; property_list_t *baseProperties;}
-
内存分配
-
sizeof:
运算符,获取类型大小,程序编译时获取
-
class_getInstanceSize:
函数,运行时获取,实例变量实际占用的内存大小,内存对齐以
8
对齐 -
malloc_size:
函数,实例变量在堆中分配的内存大小,内存大小是
16
的倍数