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

一、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  

#import

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


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

你可能感兴趣的:(OC底层原理一对象、alloc分析、isa理解)