什么版本方法包含?

时间:2014-01-24 11:40:13

标签: objective-c

我正在阅读苹果文档,其中我遇到了发布方法说明。其中说:

  

当引用计数达到0时,会向接收方发送dealloc消息。

所以,我想知道发布方法的定义是什么?是否有检查保留计数的条件?如果保留计数为0,则对象被解除分配?

如果有人提供代码段,那将会很有帮助。

3 个答案:

答案 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消息。