iOS小知识之对象的本质
每天一个小知识,稳步前进不用愁。 使用clang还原Objective-C代码在底层的实现,来探索对象的本质是什么! 打开main.m函数,写入如下代码:
#import <Foundation/Foundation.h> #import <objc/runtime.h> @interface LGPerson : NSObject @property (nonatomic, strong) NSString *Name; @end @implementation LGPerson @end int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); } return 0; }复制代码
使用clang命令,生成main.cpp文件
clang -rewrite-objc main.m -o main.cpp复制代码
通过分析cpp文件,来探索对象的本质 找到LGPerson的定义与实现,可以发现
typedef struct objc_object LGPerson; struct LGPerson_IMPL { struct NSObject_IMPL NSObject_IVARS; NSString *_Name; };复制代码
LGPerson
定义为objc_object
类型LGPerson_IMPL
是LGPerson
的底层实现LGPerson_IMPL
中嵌套NSObject_IMP
L结构体结构体嵌套相当于伪继承
找到NSObject的定义与实现,可以发现
typedef struct objc_object NSObject; struct NSObject_IMPL { Class isa; };复制代码
NSObject
定义为objc_object
类型NSObject_IMPL
是NSObject
的底层实现只有一个
Class
类型的成员变量isa
找到Class的定义与实现,可以发现
typedef struct objc_class *Class; struct objc_class { Class _Nonnull isa __attribute__((deprecated)); } __attribute__((unavailable));复制代码
Class
类型,本质是objc_class
结构体指针,占8字节
找到objc_object
的实现,可以发现
struct objc_object { Class _Nonnull isa __attribute__((deprecated)); };复制代码
objc_object
只有一个Class
类型的成员变量isa
所有对象的底层实现,本质上都来自于
objc_object
结构体
结论:
对象的本质是结构体
类也是对象,本质同样是结构体
万物皆对象,万物皆有isa
isa本质是结构体指针,占8字节
所有对象的底层实现,本质上都来自于objc_object结构体
作者:叶秋主
链接:https://juejin.cn/post/7018346390036152350