TaggedPointer
内存管理方案.NONPOINTER_ISA
方案SideTable是一张哈希表.使用多张 SideTable .因为可以提高查找效率.对象的引用计数值修改时候可能存在不同线程,需要锁保证数据安全,如果用同一张表会导致效率问题,需要使用分离锁
分离操作.
经过一系列调用,最终调用了C函数calloc,此时并没有设置引用计数为1
SideTable &table = SideTables()[this];
//在tables里面,根据当前对象指针获取对应的sidetable
size_t &refcntStorage = table.refcnts[this];
//获得引用计数
//添加引用计数
refcntStorage += SIDE_TABLE_RC_ONE(4,位计算)
SideTable &table = SideTables()[this];
RefcountMap::iterator it = table.refcnts.find[this];
it->second -= SIDE_TABLE_RC_ONE
SideTable &table = SideTables()[this];
size_t refcnt_result = 1;
RefcountMap::iterator it = table.refcnts.find[this];
refcnt_result += it->second >> SIDE_TABLE_RC_SHIFT;(将向右偏移操作)
{
id __weak obj1 = ob1;
// => 编译
id objc1;
objc_initWeak(&obj1,obj);
//obj1弱引用对象地址,obj被修饰对象
}
添加weak变量