ios - 为什么保留计数在 Debug模式和运行模式下不同?

标签 ios memory-management automatic-ref-counting llvm-gcc retain-cycle

我知道 ARC 和 MRC 的工作原理。但是我在测试下面的代码时很困惑。我不知道为什么会这样。为什么同一个问题在 Debug模式和运行模式下的保留计数不同?

    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)); 上崩溃b 是 a 的 weak 引用。并在将 nil 分配给它时反对 get release。但在此之前,如果将前两行的输出显示为下图。这也是正确的。

enter image description here

但是当应用程序处于 Debug模式时(意味着我们已经设置了断点和调试)然后应用程序没有崩溃并且还在每行上显示保留计数 2。如下图。

enter image description here

有人知道为什么会这样吗?为什么相同的代码对于不同的模式给出了两个不同的保留值?

最佳答案

documentation 中的第一句话对于 retainCount 方法说:

请勿使用此方法。

之后:

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

只是不要使用它。

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

我一直把这理解为“它可能有用,但值(value)可能不是你认为应该的。不要看绝对值就下任何结论,因为我们可能会做我们想做的每一个魔术有了它,这不关你的事。”

关于ios - 为什么保留计数在 Debug模式和运行模式下不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35172268/

相关文章:

c - 静态变量的内存映射

hibernate - 在 Grails/Tomcat 上的长批处理期间出现 OutOfMemoryError

c++ - 如何释放动态大小的结构

objective-c - 哪些 iOS 类不支持归零弱引用?

objective-c - 实现 API 时如何避免在 block 中捕获 self ?

ios - 使用 HTML 5 在 iPad 应用程序中自动播放

ios - 更改 UINavigationController 按钮的颜色

ios - 将 NSString 转换为整数

objective-c - ARC,核心数据和多线程,ARC释放对象

ios - 我如何检测具有不同邻近 UUID 的信标?