iOS开发-weak引用以及sidetable表

__weak

id obj = [[NSObject alloc] init];
@autoreleasepool {
   
	id __weak obj1 = obj;
	NSLog(@"%@",obj1);
}

括号内的代码编译器会转化为:

id obj1;
objc_initWeak(&obj1,obj);
id tmp = objc_loadWeakRetained(&obj1);
objc_autorelease(tmp);
NSLog(@"%@",tmp);
objc_destroyWeak(&obj1);
  • 调用objc_initWeak存入sidetable
  • objc_loadWeakRetain返回自身,并引用计数+1(refcntsvalue+固定增量值)
  • objc_autorelease加入自动释放池
  • objc_destroyWeakweak指针从weak_table_t表中移除

那么sidetable这个表是什么?

sidetable

并不是只有弱引用对象才有这个sidetableobjc_object对象拥有isa指针,这个指针中存储了许多信息,其中几位就存储了引用计数,但是当引用计数大于无法使用位存储时,也会创建sidetable,并使用sidetable进行引用计数。同时objc_initWeak也是创建sidetable的。

这里贴出了isa源码中arm64位架构

# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
    struct {
   
        uintptr_t nonpointer        : 1;
        uintptr_t has_assoc         : 1; //有关联的对象
        uintptr_t has_cxx_dtor      : 1; //c++ 析构
        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; //是否有sidetable引用计数
        uintptr_t extra_rc          : 19
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值