我知道 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。但在此之前,如果将前两行的输出显示为下图。这也是正确的。
但是当应用程序处于 Debug模式时(意味着我们已经设置了断点和调试)然后应用程序没有崩溃并且还在每行上显示保留计数 2。如下图。
有人知道为什么会这样吗?为什么相同的代码对于不同的模式给出了两个不同的保留值?
最佳答案
documentation 中的第一句话对于 retainCount
方法说:
请勿使用此方法。
之后:
您不太可能从这种方法中获得有用的信息
只是不要使用它。
正如 trojanfoe 在评论中指出的那样,给定代码中使用的 CFGetRetainCount 有一个类似的(可能稍微少一些)免责声明。
我一直把这理解为“它可能有用,但值(value)可能不是你认为应该的。不要看绝对值就下任何结论,因为我们可能会做我们想做的每一个魔术有了它,这不关你的事。”
关于ios - 为什么保留计数在 Debug模式和运行模式下不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35172268/