ios - 为什么这不会崩溃?

标签 ios objective-c crash exc-bad-access

<分区>

为什么循环中的第二行(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/

上一篇:ios - 编程 UITextField 以在按下 'Return' 时转到下一行?

下一篇:ios - UITableView 中的 NSDictionary - 使用索引路径

相关文章:

ios - 扩展 iOS 11 安全区域以包括键盘

iphone - 为什么以及何时应该在 iOS 应用程序中使用 C/C++ 代码?

Swift:执行 Segue 在展开可选值时抛出发现的 nil

windows - 为什么我的应用程序在另一台电脑上启动时崩溃?

ios - 自动收缩标签,但为所有其他 UITableViewCell 保持相同的字体大小

ios - 加密信息不可用。再试一次。试飞

iphone - 从 iPhone 上的音频流中获取 Hz 频率

ios - 我如何以编程方式关闭 UIAlertController

ios - JSQMessagesViewController : my message doesn't Show up

iPhone:应用程序委托(delegate)中的 NSTimer 无效导致应用程序崩溃