@PEND
2019-05-09T08:23:21.000000Z
字数 1715
阅读 553
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.cpp
typedef 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; // NSObject
int _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.h
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache;
class_data_bits_t bits;
// ...
}
// objc-private.h
struct 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
。