ios - 为什么它是 "exc_bad_access"而不是 "run-time"或 "compile-time"错误?

标签 ios objective-c xcode memory exc-bad-access

ScreenShot : running mode of xCode 5.1

为什么它是 exc_bad_access 而不是 run-timecompile-time 错误?

我不小心写了 "@age" 而不是 @"age",这激发了我的好奇心。

我对 exc_bad_access 的理解是:Bad-Access 是由 dereferenced 的指针(好的引用)引起的 到一个尚未分配或已解除分配或未经授权访问的内存位置(const 或其他东西)。

但在这种情况下,我只是将数据写入内存,语法与 NS Objective-c 格式不匹配。因此它应该是 run-time 错误而不是 Bad-Access

我在哪里错过了这个概念?

最佳答案

您获得 EXC_BAD_ACCESS 的原因是 -initWithObjects: 方法要求其所有参数都是有效的 Objective-C 对象。每个 Objective-C 对象都以一个小标题开始; this 曾经是一个直接的指针,称为 isa,指向它的类对象(它不再那么简单了,现在你不应该自欺欺人;有 Objective-C如有必要,您可以使用运行时 API)。

这里没有出现编译器错误的原因是在 C/C++/Objective-C 中无法为“varargs”方法或函数指定正确的类型。因此,编译器允许您传递 任何 类型的参数,假设您知道自己在做什么。

无论如何,在 -initWithObjects: 的实现中,它会尝试向您传入的每个对象发送 -retain 消息。当它这样做时,它将尝试取消引用 isa 指针。对于您的 C 字符串,这意味着它将把字符串的前四个或八个字节视为一个指针。这不太可能产生好的结果,而且很可能您会立即获得 EXC_BAD_ACCESS。即使你很幸运并且它们确实指向了有效的内存,Objective-C 运行时也会期望它们指向一个有效的 Class 结构,这非常不太可能,其结果也很可能是 EXC_BAD_ACCESS。

关于ios - 为什么它是 "exc_bad_access"而不是 "run-time"或 "compile-time"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570793/

相关文章:

ios - 如何以编程方式从 UIVIew 呈现 View Controller

ios - NSUrlConnection 似乎没有工作,

ios - 如何在 Xcode 6 中向 Storyboard添加带边框的按钮

xcode - SwiftUI 动态修改 TextField 格式、字符串模式、掩码

ios - xcode info.plist 构建变量 ${PRODUCT_NAME :rfc1034identifier} seems completely undocumented?

objective-c - CoreData 列表中的排序和设置默认值

ios - UIView 动画将 View 重置为原始矩形

ios - React native - fbsdk LoginManager 与 LoginButton

ios - 如何比较 ios 中大于 3 秒的时间

objective-c - -[NSObject autoContentAccessingProxy] 是否有效?