release 方法主要用于 reference counting。 有一点不太确定:方法中先判断是否达到释放条件,如果没达到,然后 count 减一? 还是另一种相反的情况:先将 count减一,然后判断是否达到释放条件呢??
从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);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。