为什么在调试模式和运行模式下保留计数不同?

Cra*_*per 1 memory-management llvm-gcc ios automatic-ref-counting retain-cycle

我知道ARC和MRC的工作原理。但是在测试以下代码时我感到困惑。我不知道为什么会这样。为什么对于相同的问题,在调试模式和运行模式下保留计数不同?

    NSMutableArray *a = [NSMutableArray array];
    [a addObject:@"abc"];
    NSLog(@" 1 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    __weak  NSMutableArray *b = a;
    NSLog(@" 2 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    a = nil;
    NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
    [b addObject:@"xys"];
    NSLog(@" 4 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
Run Code Online (Sandbox Code Playgroud)

当我在运行模式下运行应用程序时,NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));由于b是a的weak引用,因此我认为该应用程序崩溃。并在分配nil给对象时反对获取释放。但在此之前,如果将前两行的输出显示为下图。这也是正确的。

在此处输入图片说明

但是,当应用程序处于调试模式(意味着我们已设置断点和调试)时,该应用程序不会崩溃,并且每行还显示保留计数2。如下图所示。

在此处输入图片说明

有谁知道为什么会这样吗?为什么相同的代码为不同的模式赋予两个不同的保留值?

Eik*_*iko 5

该方法文档中的第一句话是retainCount

不要使用此方法。

然后:

您极不可能从此方法获得有用的信息

只是不要使用它。

正如trojanfoe在评论中指出的那样,给定代码中使用的CFGetRetainCount具有类似的(可能稍微少一些)免责声明。

我一直把这理解为“它可能有用,但价值可能不是您认为的应有的。不要通过查看绝对值来得出任何结论,因为我们可能会尽其所能去做每件事,这不是你的事。”