<分区>
<分区>
为什么循环中的第二行(a.retainCount 行)不会崩溃(由于访问错误)?
NSArray* a0 = @[[NSMutableString stringWithString:@"a"]];
NSArray * arr = [NSArray arrayWithObject:a0];
[a0 release];[a0 release];
for (NSArray* a in arr)
{
//NSLog(@"%d", (a == a0) );
NSLog(@"RC: %d", a.retainCount);
}
但如果循环中的第一行 (a == a0 one) 未被注释,它会崩溃。
当自动释放池被耗尽时,这肯定会崩溃,但我特别询问循环中的第二行,而不是之后。
谁能解释一下?
最佳答案
请查看http://www.whentouseretaincount.com/
向释放的对象发送消息是未定义的行为。它可能会崩溃,也可能不会。
在这种情况下,它不会崩溃,因为包含对象的内存没有被其他东西覆盖。如果您要打开 Malloc Scribble,它会崩溃。对 NSLog()
的调用 巧合 导致内存被涂鸦,导致崩溃。
retainCount
永远不会准确地返回 0,因为向已释放的对象发送消息是未定义的行为。系统不会费心将 RC 递减为 0,因为该对象无论如何都不再可行。
我很好奇这个问题是在什么情况下提出来的?您使用的是使用 retainCount
的教程或类(class) Material 吗?
它并不总是一个段错误,原因与运行时不会将保留计数递减为 0 的原因相同;效率。
要使其成为有保证的段错误将意味着浪费几个周期将虚假值写入内存(或减少保留计数)。
实际上,free()
只是将内存标记为可用于将来的 malloc()
。它不会以任何方式修改内存的内容,因此未定义的行为。
关于ios - 为什么这不会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406433/