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插入保留/释放,但我不确定。
首先是通常的免责声明:保留计数的绝对值并不能告诉你任何有用的信息,更多信息请参阅
- http://whentouseretaincount.com
- 何时使用-retainCount?
现在在你的情况下,在线
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