美文网首页
OC对象底层实现

OC对象底层实现

作者: Mr_wick | 来源:发表于2021-04-06 11:22 被阅读0次

将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;
}

从上面的源码可以转化成如下图:


image.png

结论:
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个成员变量:父类的指针、缓存调用过的方法、类的实例方法链表。

相关文章

网友评论

      本文标题:OC对象底层实现

      本文链接:https://www.haomeiwen.com/subject/aurskltx.html