类的内存分析 - ShenYj/ShenYj.github.io GitHub Wiki
Objective-C的面向对象都是基于C/C++的数据结构实现的,所以我们可以将Objective-C代码转换成C/C++代码,来研究OC对象的本质
将一个简单的OC类转义成的C++
代码
-
通过
C++
代码可以看到OC类
被编译成一个struct
struct OC类的类名_IMPL { struct NSObject_IMPL NSObject_IVARS; /// 如果有@perproty 属性也会有对应的成员变量, 比如: NSString *_name; };
-
继续搜索
NSObject_IMPL
的定义, 得到NSObject_IMPL
本质是一个Class
struct NSObject_IMPL { Class isa; };
-
继续搜索
Class
, 得到NSObject_IMPL
本质是一个objc_class
结构体类型的指针typedef struct objc_class *Class;
由此可见
struct NSObject_IMPL
其实就是NSObject的底层结构,或者说底层实现。换个角度理解,可以说C/C++的结构体类型支撑了OC的面相对象
- 实例对象的本质就是一个结构体
- 类的本质是
objc_class
结构类型的指针,继承自objc_object,所有的Class都是以 objc_class 为模板创建的
Object-C
类的底层实现核心就是 objc_object
和 objc_class
objc_object
就是OC中对象object的c语言定义,可以看到对象就是一个结构体
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
此结构体内有一个isa成员变量,其类型为Class。
顺便了解下OC中常用的一个通用类型id,最初写代码的时候有没有疑惑过为什么声明id类型的变量不用加上*
因为它本身就是一个指针, 是一个指向objc_object的指针。
objc_class结构体里存储了父类、方法列表等信息
Class
类型其实就是指向objc_class(objc-runtime-new.h) 结构体的指针
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
class_rw_t *data() const {
return bits.data();
}
考虑篇幅等原因,其他静态成员变量、方法省略...
}