(亚洲城娱乐官网欢迎您) 关于OC中的内存管理:release 方法先判断释放条件还是将count 减一?

release 方法主要用于 reference counting。 有一点不太确定:方法中先判断是否达到释放条件,如果没达到,然后 count 减一? 还是另一种相反的情况:先将 count减一,然后判断是否达到释放条件呢??

从NSObject的源代码来看,是先判断计数器是否达到释放条件,如果可以释放了,就调用dealloc,如果没到,就对计数器减2。但是,了解这个内部的实现细节有什么实际意义吗?也许下一个版本就改成另一种方式了。

- oneway voidrelease
__attribute__aligned16
{ // 检查计数器 if _objc_rootReleaseWasZeroself == false { // 不满足释放条件,就返回 return; } // 否则,就执行释放操作 [self dealloc];
} bool
_objc_rootReleaseWasZeroid obj
{ assertobj; assert!UseGC; if OBJC_IS_TAGGED_PTRobj return false; SideTable *table = SideTable::tableForPointerobj; bool do_dealloc = false; if OSSpinLockTry&table->slock { // 找到这个对象的计数器 RefcountMap::iterator it = table->refcnts.findDISGUISEobj; if it == table->refcnts.end { // 没找到计数器,返回可以释放 do_dealloc = true; table->refcnts[DISGUISEobj] = 1; } else if it->second == 0 { // 计数器为0,也返回可以释放 do_dealloc = true; it->second = 1; } else { // 否则,对计数器减2(因为retain的时候是加2) it->second -= 2; } OSSpinLockUnlock&table->slock; return do_dealloc; } return _objc_rootReleaseWasZero_slowobj;
}

完整的源代码在这里:http://opensource.apple.com/source/objc4/objc4-532.2/runtime/NSObject.mm?txt

release方法里没有判断逻辑,是否达到释放条件也与release无关。

release只负责对rc减1,至于是n-1还是0-1,不管,如果是0-1,直接挂。

是否打到释放条件是一个release pool判断的

发表评论

电子邮件地址不会被公开。 必填项已用*标注