为什么使用XCode Clean and Build修复EXC_BAD_ACCESS?

Edd*_*die 5 compiler-construction xcode exc-bad-access swift

我已经看到很多人(包括我)EXC_BAD_ACCESS以未知的原因面对坠机事故。解决方案clean and build the project标记为正确的答案很多。

我很好奇为什么会发生这种情况,以及如何清洁和重新构建它,但似乎人们只是不在乎并继续使用清洁构建解决方案。

这是使用干净构建解决方案的示例EXC_BAD_ACCESS

就我而言,我面临着这样一个荒谬的事情:

func viewDidLoad() {
    super.viewDidLoad()
    self.childVC.delegate = self // => Crashed EXC_BAD_ACCESS here. Fixed after clean and build
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这在Swift中比在Objective-C中发生的更多。 难道是Swift的功能吗?

Bio*_*tic 4

这些是我的想法:

运行后,如果项目尚未构建,则 Xcode 会在以下位置生成所需的构建文件:

〜/库/开发人员/Xcode/DerivedData/

如果未手动或自动清理项目,则在运行的应用程序中会重复使用相同的构建文件,以减少后续的构建时间。

您可能已经注意到,Xcode 有时会在任何重大代码更改后自动清理构建。例如,关于:

  • 改变静态变量
  • 更改 swift 项目中的 Objective-C 代码

但 Xcode 仍然存在缺陷,有时在需要时不会自行清理,从而可以使用“损坏的”构建文件运行,最终导致此类EXC_BAD_ACCESS错误。

清理它会清除旧的构建文件,新的构建不会有同样的问题。

  • 我认为主要原因是应用程序对象指针指向特定机器内存的地址发生了变化。假设在您的示例中,childVC 的初始地址为 0x27382af,但随着时间的推移,新的内容被写入该地址,或者该地址变得不可用,并且构建文件中的指针不会更改 - 因此它会自动引发“EXC_BAD_ACCESS”。 (2认同)