为什么在debugging模式和运行模式下保留计数是不同的?

我知道ARC和MRC是如何工作的。 但在testing下面的代码时我感到困惑。 我不知道这是为什么发生。 为什么在debugging模式和运行模式下,同一个问题的保留计数是不同的?

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)); 

当我在运行模式下运行应用程序时,应用程序在NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));行上崩溃NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b)); 我理解为b是一个weak参考。 并在分配nil时反对获取释放。 但在此之前如果显示出前两行的输出作为下面的图像。 这也是正确的。

在这里输入图像说明

但是,当应用程序是debugging模式(意味着我们已经设置了断点和debugging),那么应用程序没有崩溃,并显示每行保留数2。 如下图所示。

在这里输入图像说明

有没有人知道为什么会发生这种情况? 为什么相同的代码为不同模式提供了两个不同的保留值?

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

不要使用这种方法。

然后:

从这个方法中获得有用的信息是不太可能的

只是不要使用它。

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

我一直把它理解为“它可能是有用的,但价值可能不是你想象的那样,不要看绝对值得出任何结论,因为我们可能会做所有的魔法,这不是你的事情“。