我知道 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 是weak
参考a.并在分配时对象获取释放nil
到它。但在此之前,如果显示前两行的输出,如下图所示。这也是正确的。
但是当应用程序处于调试模式时(意味着我们已经设置了断点并进行调试),那么应用程序不会崩溃,并且每行还显示保留计数 2。如下图所示。
有谁知道为什么会发生这种情况?为什么相同的代码对于不同的模式给出两个不同的保留值?
文中的第一句话文档为了retainCount
方法说:
不要使用此方法。
然后:
您不太可能从该方法中获得有用的信息
只是不要使用它。
正如 trojanfoe 在评论中指出的那样,给定代码中使用的 CFGetRetainCount 也发布了类似的(可能稍微少一些)免责声明。
我一直将其理解为“它可能有用,但价值可能不是你认为应该的那样。不要通过查看绝对值得出任何结论,因为我们可能会用它做我们想做的每一个魔术,这不关你的事”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)