Runtime -- isa

OC是一门动态性比较强的编程语言
OC的动态性是有Runtime API来支撑的
Runtime API提供的接口基本都是C语言的,源码由C/C++/汇编语言编写

isa

在arm64架构之前,isa就是一个普遍的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息

struct objc_object {
    isa_t isa;
}

union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls;
    uintptr_t bits;
#if defined(ISA_BITFIELD)
    struct {
        ISA_BITFIELD;  // defined in isa.h
    };
#endif
};

//	以arm64架构为例
# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD 
	  /*
	  	0:代表普通的指针,存储着Class、Meta-Class对象的内存地址
	  	1:代表优化过,使用位域存储更多的信息
	  */	                                                     			 \
      uintptr_t nonpointer        : 1;                                       \
      /*
	  	是否有设置过关联对象,如果没有,释放时会更快
	  */
      uintptr_t has_assoc         : 1;                                       \
      /*
      	是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
      */
      uintptr_t has_cxx_dtor      : 1;                                       \
      /*
      	存储着Class、Meta-Class对象的内存地址信息
      	MACH_VM_MAX_ADDRESS 0x1000000000
      */
      uintptr_t shiftcls          : 33; 									 \
      /*
      	用于在调试时分辨对象是否未完成初始化
      */
      uintptr_t magic             : 6;                                       \
      /*
      	是否有被弱引用指向过,如果没有,释放时会更快
      */
      uintptr_t weakly_referenced : 1;                                       \
      /*
      	对象是否正在释放
      */
      uintptr_t deallocating      : 1;                                       \
      /*
      	引用计数器是否过大无法存储在isa中
      	如果为1,那么引用计数会存储在一个叫SideTable的类的属性中
      */
      uintptr_t has_sidetable_rc  : 1;                                       \
      /*
      	里面存储的值是引用计数器减1
      */
      uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

/*
	销毁对象的时候
		判断是否有析构:		bool cxx = obj->hasCxxDtor();
		判断是否有关联对象:	bool assoc = obj->hasAssociatedObjects();
*/
void *objc_destructInstance(id obj) 
{
    if (obj) {
        // Read all of the flags at once for performance.
        bool cxx = obj->hasCxxDtor();
        bool assoc = obj->hasAssociatedObjects();

        // This order is important.
        if (cxx) object_cxxDestruct(obj);
        if (assoc) _object_remove_assocations(obj);
        obj->clearDeallocating();
    }

    return obj;
}


//  共用体 union --- 大家都共用一块内存
union {
    //  位域 (越前面的 -- 所在的 -- 位数越低)
    char bits;
    //  为了可读性
    struct {
        char tall       : 1;    // 占 1 位
        char rich       : 1;    // 占 1 位
        char handsome   : 1;    // 占 1 位
    };
}_tallRichHandsome;


&   按位与     都是1才为1,否则为0
    1、可以取出特定位的值  --- 将要取出的位设置为1,其他位设置为0&运算后,就可以得到要取的位的值)
    2、将某一位设置为0  --- 将要设置的位置为0,其他位置为1&运算后,其他位不便,要设置的位肯定是为0的)
----------------------------------------------------------------
|   按位或     有1就为11、将某一位设置为1  --- 将要设置的位设置为1,其他位设置为0|运算后,其他位不变,要设置的位肯定是为1的)
----------------------------------------------------------------
~   按位取反   每位由1001
----------------------------------------------------------------
!!  可以得到BOOL值

PS 此文为学习 李明杰 老师的 iOS底层原理课程 所写笔记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值