@PEND
2019-05-09T08:23:21.000000Z
字数 1715
阅读 653
iOS

/** 储存* 1.isa指针* 2.成员变量的值*/NSObject *object = [[NSObject alloc] init];
/** 储存:* 1.isa指针* 2.superclass指针* 3.属性信息* 4.对象方法信息* 5.协议信息* 6.成员变量信息*/Class objectClass = [object class];Class objectClass = object_getClass(object);Class objectClass = [NSObject class];
/** 储存:* 1.isa指针* 2.superclass指针* 3.类方法信息*/Class objectMetaClass = object_getClass([NSObject class]);
Class objc_getClass(const char *aClassName)
Class object_getClass(id obj)
-(Class)class、+ (Class)class
1.首先,在 NSObject.h 文件中我们可以看到如下信息
@interface NSObject <NSObject> {Class isa OBJC_ISA_AVAILABILITY;}
2.将 main.m 通过 clang 工具编译为 C++ 代码
// 编译命令(指定arm64指令集)xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp// main.m#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {NSObject *objc = [[NSObject alloc] init];}return 0;}// main-arm64.cpptypedef struct objc_object NSObject; // NSObject 是 struct objc_object 结构体的别名struct NSObject_IMPL {Class isa; // isa 指针// 成员变量};// 如果存在继承关系Person:NSObject@property (nonatomic,assign) int i;typedef struct objc_object Person;struct Person_IMPL {struct NSObject_IMPL NSObject_IVARS; // NSObjectint _i; // 成员变量};
3.接下来需要了解 Class 和 struct objc_object 的实现,进runtime源码
// objc.h/// 表示Objective-C类的不透明类型。typedef struct objc_class *Class;/// 表示类的实例。struct objc_object {Class isa OBJC_ISA_AVAILABILITY;};// objc-runtime-new.hstruct objc_class : objc_object {// Class ISA;Class superclass;cache_t cache;class_data_bits_t bits;// ...}// objc-private.hstruct objc_object {private:isa_t isa;public:// ...}
4.内部结构

5.总结
NSObject是struct objc_object类型。objc_class继承自objc_object类型。Class是struct objc_class类型。objc_object内部含有一个isa变量,其类型是isa_t。