java中isa什么意思_iOS中isa的深层理解

我之前的isa理解不透彻,现在重新梳理我对iOS底层object的理解.(只代表个人理解).

在中我们可以看到:

typedef struct objc_class *Class;

struct objc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

/// A pointer to an instance of a class.

typedef struct objc_object *id;

解释这段代码: objc_object中有一个Class类型的属性isa,而Class是一个指向objc_class的指针,存放着一个objc_class的地址. id是一个指向objc_object的指针.那objc_class是个什么东西呢?

在中我们看到:

(这里struct类型是c++对c的扩展,除了访问权限是public之外其他的和class一模一样)

struct objc_class {

Class isa OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

Class super_class OBJC2_UNAVAILABLE;

const char *name OBJC2_UNAVAILABLE;

long version OBJC2_UNAVAILABLE;

long info OBJC2_UNAVAILABLE;

long instance_size OBJC2_UNAVAILABLE;

struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;

struct objc_method_list **methodLists OBJC2_UNAVAILABLE;

struct objc_cache *cache OBJC2_UNAVAILABLE;

struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

解释这段代码: objc_class中也有一个isa指针,这个指针不是指向自己而是mateclass(元类),简单介绍一下元类的概念

元类是类对象的类,类对象是元类的实例。基于这种设计模式,不难发现:

1.我们以前调用 "+" 开头的类方法实际是在调用元类的对象方法

2.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例

那么,元类是对象吗?

答案是肯定的,元类是对象。

如果元类也是对象,元类的类又是什么?

下图解释:

20f1251916b9

WechatIMG56.png

// model * zyn = [[model alloc]init];

Class metaClass_parent = objc_getMetaClass("model_parent");

Class metaClass_child = objc_getMetaClass("model_child.h");

Class superClass_metaClass_parent = class_getSuperclass(metaClass_parent);

Class superClass_metaClass_child = class_getSuperclass(metaClass_child);

Class metaClass_NSObject = objc_getMetaClass("NSObject");

Class superClass_metaClass_NSObject = class_getSuperclass(metaClass_NSObject);

结果:下图

20f1251916b9

屏幕快照 2017-02-16 下午4.55.52.png

其实到这就明白了:

1 , objc_object中的isa 指的是对象的类;

2 , objc_class中的isa只的是类的元类;

3 , superClass是一层层集成的,到最后NSObject的superClass是nil.而NSObject的isa指向根元类,这个跟元类的isa指向它自己,而它的superClass是NSObject,也就是最后形成一个环,这个环让我想起了先有鸡还是先有蛋的问题.

4 , mateClass也是相互继承的.

5 , 这个逻辑就想着objc_class的struct,里面有个isa属性,还有个super_class属性,他俩都是指针,其实在objc_class的定义中也能看出来,每一个objc_class都有isa,但是不一定会有super_class,近三天每天想一次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值