ARC实例变量保留释放

时间:2014-02-09 11:52:18

标签: ios objective-c memory-management automatic-ref-counting

如果我们有这样的.h文件:

@interface TestViewController : UIViewController {

    __weak NSObject *object;
}

@end

和.m文件中的方法如下:

- (void)viewDidLoad {

    [super viewDidLoad];
    NSObject *localObject = [[NSObject alloc] init];
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)localObject));
    object = localObject;
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)object));
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)localObject));
}

然后我们得到以下输出以保留计数:

1
2
1

我的问题是为什么保留计数在"对象"上增加到2?当它被声明为" __ weak"实例变量,此外" localObject"保留计数仍为1。 我认为这是因为ARC插入保留/释放的方式,但我不确定。

1 个答案:

答案 0 :(得分:4)

首先,通常的免责声明:保留计数的绝对值并不能告诉您任何有用的信息,有关详细信息,请参阅

现在在你的情况下,在行

NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)object));

你读了一个弱指针的值,Clang/ARC documentation 4.2 Semantics说明了这个:

  

对于__weak个对象,保留当前的指针,然后释放   在当前的完整表达结束时。

因此,对象的保留计数在传递给CFGetRetainCount()时增加1。您也可以在生成的汇编代码中看到:

movq    %rbx, %rdi
callq   _objc_retain
movq    %rax, %rbx
.loc    1 21 0                  
movq    %rbx, %rdi
callq   _CFGetRetainCount
movq    %r15, %rdi
movq    %rax, %rsi
xorb    %al, %al
callq   _NSLog
movq    _objc_release@GOTPCREL(%rip), %r12
movq    %rbx, %rdi
callq   *%r12