ARC实例variables保留发布

如果我们有这样的.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

我的问题是为什么当保留计数被增加到“object”当它被声明为“__weak”实例variables,此外“本地对象”保留计数保持1.我认为这是因为如何ARC插入保留/释放,但我不确定。

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

现在在你的情况下,在线

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

你读了一个弱指针的值,而Clang / ARC文档4.2语义描述了这个:

对于__weak对象,当前指针被保留,然后在当前完整expression式的末尾被释放。

因此,传递给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