【问题标题】:ARC instance variable retain releaseARC 实例变量保留释放
【发布时间】:2014-03-06 16:37:29
【问题描述】:

如果我们有这样的 .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”实例变量时,保留计数会增加到 2,而且“localObject”保留计数仍然为 1。 我认为这是因为 ARC 如何插入保留/释放,但我不确定。

【问题讨论】:

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


【解决方案1】:

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

现在在你的情况下,在行中

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

您读取了一个弱指针的值,Clang/ARC documentation 4.2 Semantics 对此进行了说明:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多