isa指针详解

本文详细介绍了Objective-C中的isa指针,包括其在arm64之前的简单形式和之后的复杂结构,如位域存储更多信息,如何进行取值、赋值操作。还讨论了isa的内存结构,如non pointer标志、has_assoc、has_cxx_dtor、shiftcls、magic、weakly_referenced和引用计数等关键属性,以及它们在对象生命周期和内存管理中的作用。

在arm64之前,isa是一个普通的指针,存储着class和meta-class的内存地址

从arm64之后,isa指针变成了一个共用体,还使用位域来存储更多的信息

取值:取哪一位,哪一位为1,其他为0,取&,例如:取出1101中的第二个1
0000 1101
&0000 0100(取值的那位置为1,其他位为0,取&)(掩码mask)
0000 0100

赋值:赋0,例如将1101中第二个1,置为0
0000 1101
&1111 1011(赋值位为0,其他位置为1,取&)(掩码mask)
0000 1001

赋值:赋1,例如将1001中第一个0,置为1
0000 1001
| 0000 0100(赋值位为1,其他位置为0,取|)(掩码mask)
0000 1101

用结构体来取代多个mask 的定义

struct {
     char  first : 1;
     char  second:1;
     char  third:1
}Mask;

共用体

union {
   char bites;//(结构体大于一个字节的时候使用int,long等)
   struct{
       char  first : 1;
       char  second:1;
       char  third:1
    }
}Mask;

isa的内存结构,shiftcls占33位,表示指向的类或者元类
在这里插入图片描述
(1)non pointer,为0表示直接是类或者元类的指针,1表示经过优化的,使用用位域和共用体,存放更多信息的
(2)has_assoc是否是关联对象,没有的话,释放更快
(3)是否有c++的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值