其他分享
首页 > 其他分享> > 「类与对象」说一说isa指针

「类与对象」说一说isa指针

作者:互联网

概要

在讲isa指针前,我们先来看一道经典的面试题:

对象的isa指针指向哪里?

看到这道题,心中可能朦朦胧胧有些答案,也可能不太确定,抑或说不明白。那咱就带着这个问题,揭开isa指针的神秘面纱。

这篇文章主要就isa的作用、数据结构以及如何优化等方面进行讲解。

isa的作用

在文章NSObject对象的分类中,详细讲解了isa指针的指向、如何寻找实例方法和类方法以及如何通过isa指针找到类对象和元类对象的。

基本总结一下,instance对象的isa指向instance对象所对应的Class对象,Class对象的isa指向Class对象所对应的MetaClass对象。

isa结构变化

在ARM 32位的时候,isa的类型是Class类型的,直接存储着实例对象或者类对象的地址, 具体结构如下所示:

typedef struct objc_class *Class;
typedef struct objc_object {
	Class isa;
} *id;

在ARM64结构下,isa的类型变成了共用体(union),使用了位域去存储更多信息。

isa_t 结构如下所示:

union isa_t 
{
    Class cls;
    uintptr_t bits;
		struct {
        uintptr_t nonpointer        : 1;
        uintptr_t has_assoc         : 1;
        uintptr_t has_cxx_dtor      : 1;
        uintptr_t shiftcls          : 33; // MACH_VM_MAX_ADDRESS 0x1000000000
        uintptr_t magic             : 6;
        uintptr_t weakly_referenced : 1;
        uintptr_t deallocating      : 1;
        uintptr_t has_sidetable_rc  : 1;
        uintptr_t extra_rc          : 19;
    };
}

位域

isa使用位域加共用体的数据结构,一方面提高了访问速度,一方面减少了内存占用。

isa中的位域

参考链接

想要关注更多iOS知识,请关注下方公众号。

猿视角

标签:存储,说一说,对象,uintptr,占用,isa,Class,指针
来源: https://blog.csdn.net/Jack_lin_/article/details/114212498