【发布时间】:2016-05-12 08:49:35
【问题描述】:
我知道 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));
当我在运行模式下运行应用程序时,应用程序在行 NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b)); 上崩溃,我理解为 b 是 a 的 weak 引用。并在将nil 分配给它时反对获取释放。但在此之前,如果显示前两行的输出如下图所示。这也是正确的。
但是当应用程序处于调试模式时(意味着我们已经设置了断点和调试),应用程序没有崩溃,并且在每行显示保留计数 2。如下图。
有人知道为什么会这样吗?为什么相同的代码为不同的模式给出两个不同的保留值?
【问题讨论】:
-
不要依赖retainCount 做任何事情。尤其是使用 ARC,您无法分辨
retains 和releases 插入的位置。在发布模式下,优化器会尽量避免无关的retains 和releases,所以你看到的数字通常会不同。 -
天哪。接力棒!
标签: ios memory-management automatic-ref-counting llvm-gcc retain-cycle