一、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的显示如下
源码objc4得到的isa-掩码NSObject-实例对象地址:0x6000011e0960
NSObject-基类地址:0x7ff841cb3030
NSObject-基类地址-另一种形式获取1:0x7ff841cb3030
NSObject-基类地址-另一种形式获取2:0x7ff841cb3030
NSObject-元基类地址:0x7ff841cb2fe0
NSObject-元基类地址-另一种形式获取1:0x7ff841cb2fe0
NSObject-元基类对象的isa指针的指向:0x7ff841cb2fe0
命令分析如下:
实例对象的isa指针指向类对象创建Person类
@interface Person : NSObject@end
Person *p1 = [[Person alloc] init];
分析可得
isa指向和类的继承关系图注意:
#import <objc/runtime.h>
#import <malloc/malloc.h>
64 位架构之下,int 类型占 4 个字节,long 类型占 8 个字节,BOOL 类型占 1 个字节,float 类型占 4 个字节,double 类型占 8 个字节,void *类型(对象指针占 8 个字节)
我的难点:偏移量方式获取父类地址不是很明白,看到的朋友可以留言指点我一下
网友评论