将main.m 文件转成main.cpp 文件
main.m中,创建了一个NSObject对象
NSObject *obj = [NSObject alloc];
[obj init];
main.cpp 展示如下:
NSObject *obj = (objc_msgSend)(objc_getClass("NSObject"), sel_registerName("alloc"));
(objc_msgSend)(obj, sel_registerName("init"));
objc_msgSend:oc消息转发,格式为:objc_msgSend(class,selector)
objc_getClass:获取类对象
sel_registerName:根据方法名得到SEL
此时搜索NSObject或者NSObject_,在7390行的位置,找到这个NSObject_IMPL,即为NSObject的底层结构,是一个结构体,里面只有一个Class类型的isa对象
struct NSObject_IMPL {
Class isa;
};
点进去看看Class为何物:
typedef struct objc_class *Class;
struct objc_object {
Class _Nonnull isa __attribute__((deprecated));
};
(已过时)Class是结构体objc_class的别名,具体如下:
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
Class isa:Class 类型的指针,每个实例对象有个isa的指针,指向对象的类,Class里也有个isa的指针, 指向meteClass(元类)。
struct objc_ivar_list * ivars :成员变量的数组
struct objc_method_list * * methodLists:方法列表
struct objc_cache * cache :缓存池
struct objc_protocol_list * protocols :协议列表
OBJC2的 objc_class:
struct objc_class : objc_object {
isa_t isa;
Class superclass;
cache_t cache;
class_data_bits_t bits;
};
objc_object如下
struct objc_object {
isa_t isa;
};
objc_object中有一个isa指针,那么objc_class继承objc_object,也就同样拥有一个isa指针,因此所有的Class都有一个isa。
isa_t如下,做个了解
union isa_t
{
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
}
从上面的源码可以转化成如下图:
结论:
1、OC 对象都是 C 语言结构体实现的,在objc2.0中,所有的对象都会包含一个isa_t类型的结构体。
2、objc_object取别名为id类型,即开发中的id类型,这个结构体中就只包含了一个isa_t类型的结构体。
3、objc_class继承objc_object。在objc_class也将isa继承下来。
4、objc_class,除了isa之外,还有3个成员变量:父类的指针、缓存调用过的方法、类的实例方法链表。