扫码关注官方订阅号
release 方法主要用于 reference counting。 有一点不太确定:方法中先判断是否达到释放条件,如果没达到,然后 count 减一? 还是另一种相反的情况:先将 count减一,然后判断是否达到释放条件呢??
小伙看你根骨奇佳,潜力无限,来学PHP伐。
从NSObject的源代码来看,是先判断计数器是否达到释放条件,如果可以释放了,就调用dealloc,如果没到,就对计数器减2。但是,了解这个内部的实现细节有什么实际意义吗?也许下一个版本就改成另一种方式了。
- (oneway void)release __attribute__((aligned(16))) { // 检查计数器 if (_objc_rootReleaseWasZero(self) == false) { // 不满足释放条件,就返回 return; } // 否则,就执行释放操作 [self dealloc]; } bool _objc_rootReleaseWasZero(id obj) { assert(obj); assert(!UseGC); if (OBJC_IS_TAGGED_PTR(obj)) return false; SideTable *table = SideTable::tableForPointer(obj); bool do_dealloc = false; if (OSSpinLockTry(&table->slock)) { // 找到这个对象的计数器 RefcountMap::iterator it = table->refcnts.find(DISGUISE(obj)); if (it == table->refcnts.end()) { // 没找到计数器,返回可以释放 do_dealloc = true; table->refcnts[DISGUISE(obj)] = 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_slow(obj); }
完整的源代码在这里: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判断的
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
从NSObject的源代码来看,是先判断计数器是否达到释放条件,如果可以释放了,就调用dealloc,如果没到,就对计数器减2。但是,了解这个内部的实现细节有什么实际意义吗?也许下一个版本就改成另一种方式了。
完整的源代码在这里: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判断的