如果我们有这样的.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插入保留/释放的方式,但我不确定。
答案 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