美文网首页
OC底层原理一对象、alloc分析、isa理解

OC底层原理一对象、alloc分析、isa理解

作者: 贴心凝姐_iOS | 来源:发表于2022-06-09 19:43 被阅读0次

    一、object-c对象分为实例(Instance)对象、类(Class)对象和元类(Meta-class)对象

    1、实例对象,通过类alloc的对象,每次调用alloc会产生新的实例对象

      struct objc_object {    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;};

     NSObject *objc = [[NSObject alloc] init];

    2、类对象:

    // 类存放isa指针、superClass指针、cache指针、vtable指针

    struct _class_t { struct _class_t *isa; struct _class_t *superclass; void *cache; void *vtable; struct _class_ro_t *ro;};

    // 类存放成员变量(成员属性、实例变量名称类型)、实例方法、协议方法   

    static struct _class_ro_t _OBJC_CLASS_RO_$_MyPerson __attribute__ ((used, section ("__DATA,__objc_const"))) = { 0, __OFFSETOFIVAR__(struct MyPerson, _age), sizeof(struct MyPerson_IMPL),  0,  "MyPerson", (const struct _method_list_t *)&_OBJC_$_INSTANCE_METHODS_MyPerson, 0,  (const struct _ivar_list_t *)&_OBJC_$_INSTANCE_VARIABLES_MyPerson, 0,  (const struct _prop_list_t *)&_OBJC_$_PROP_LIST_MyPerson,};

    3、元类对象:

    //元类存放isa指针、superClass指针 、、cache指针、vtable指针 、类方法   

    static struct _class_ro_t _OBJC_METACLASS_RO_$_MyPerson __attribute__ ((used, section ("__DATA,__objc_const"))) = { 1, sizeof(struct _class_t), sizeof(struct _class_t),  0,  "MyPerson", (const struct _method_list_t *)&_OBJC_$_CLASS_METHODS_MyPerson, 0,  0,  0,  0, };

    clang -rewrite-objc main.m -o main.cpp 

    xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp (模拟器) 

    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp (手机)

    二、分析对象在内存中的地址

    通过把main.m 转成.cpp, 可看到类(class)与元类(metaClass)的关系,后面会进一步用内存地址分析

    static void OBJC_CLASS_SETUP_$_MyPerson(void ) { OBJC_METACLASS_$_MyPerson.isa = &OBJC_METACLASS_$_NSObject; OBJC_METACLASS_$_MyPerson.superclass = &OBJC_METACLASS_$_NSObject; OBJC_METACLASS_$_MyPerson.cache = &_objc_empty_cache; OBJC_CLASS_$_MyPerson.isa = &OBJC_METACLASS_$_MyPerson; OBJC_CLASS_$_MyPerson.superclass = &OBJC_CLASS_$_NSObject; OBJC_CLASS_$_MyPerson.cache = &_objc_empty_cache;}

    1、基类如下:

    console的显示如下

    NSObject-实例对象地址:0x6000011e0960

    NSObject-基类地址:0x7ff841cb3030

    NSObject-基类地址-另一种形式获取1:0x7ff841cb3030

    NSObject-基类地址-另一种形式获取2:0x7ff841cb3030

    NSObject-元基类地址:0x7ff841cb2fe0

    NSObject-元基类地址-另一种形式获取1:0x7ff841cb2fe0

    NSObject-元基类对象的isa指针的指向:0x7ff841cb2fe0

    源码objc4得到的isa-掩码

    命令分析如下:

    实例对象的isa指针指向类对象

    创建Person类 

    @interface Person : NSObject@end

     Person *p1 = [[Person alloc] init];


    以Person对象为例的地址分析


    类的isa指向元类地址


    偏移量方式获取地址有疑问?


    分析可得

    isa指向和类的继承关系图

    注意:

    #import <objc/runtime.h> 

    #import <malloc/malloc.h>

    64 位架构之下,int 类型占 4 个字节,long 类型占 8 个字节,BOOL 类型占 1 个字节,float 类型占 4 个字节,double 类型占 8 个字节,void *类型(对象指针占 8 个字节)


    我的难点:偏移量方式获取父类地址不是很明白,看到的朋友可以留言指点我一下

    相关文章

      网友评论

          本文标题:OC底层原理一对象、alloc分析、isa理解

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