我正在阅读苹果文档,其中我遇到了发布方法说明。其中说:
当引用计数达到0时,会向接收方发送dealloc消息。
所以,我想知道发布方法的定义是什么?是否有检查保留计数的条件?如果保留计数为0,则对象被解除分配?
如果有人提供代码段,那将会很有帮助。
答案 0 :(得分:8)
NSObject的实现在10.9中被移动到ObjC运行时。因此,NSObject的实现是open source。
- (oneway void)release
__attribute__((aligned(16)))
{
// tagged pointer check is inside _objc_rootReleaseWasZero().
if (_objc_rootReleaseWasZero(self) == false) {
return;
}
[self dealloc];
}
您可以在上述链接中阅读_objc_rootReleaseWasZero()
。这是一个深深的兔子洞。
答案 1 :(得分:1)
我找到了这个答案 -
- (void)release
{
if(NSDecrementExtraRefCountWasZero(self))
[self dealloc];
}
BOOL NSDecrementExtraRefCountWasZero(id anObject)
{
if(((struct obj_layout *)anObject)[-1].retained == 0){
return YES;
} else {
((struct obj_layout *)anObject)[-1].retained--;
return NO;
}
}
答案 2 :(得分:0)
NSString* s = [[NSString alloc] init]; // Ref count is 1
[s retain]; // Ref count is 2 - silly
// to do this after init
[s release]; // Ref count is back to 1
[s release]; // Ref count is 0, object is freed
释放方法放弃对象的所有权。当Cocoa对象不再拥有任何所有者时,它可能会被释放 - 在这种情况下,它将自动发送一个dealloc消息。