给定线程1 exc_bad_access(代码= 2地址= 0x8)时Xcode不断崩溃

mha*_*r13 6 crash xcode ios ios7 xcode5

在研究了这个错误之后,我注意到它是特定于代码的但是我尝试制作,加载等的任何项目都不断给我相同的错误,并且总是引用代码的不同部分,但是由于我设置的初始程序,具有确切的默认代码,没有更多,仍然收到相同的错误,我不会看到如何添加我的错误日志可以帮助.注意在Xcode 5中使用sprite工具包时出现此错误,并且我在os x 10.8.5上运行此错误,感谢您的耐心,洞察力和希望答案.

Jas*_*ues 10

exc_bad_access通常由所谓的悬空指针引起 - 访问已经解除分配的对象.

要调试它,请通过以下任一方式启用僵尸对象:

  • Xcode:编辑方案并选中"Enabled Zombies"复选框

编辑方案

  • AppCode:编辑运行配置并设置环境变量NS_ZOMBIE_ENABLED = YES

花一些时间来学习Objective-C引用计数内存模型 - 保留,释放,保留周期和自动释放池.

您需要确保您的对象在被使用时保留.在ARC(自动引用计数 - iOS的默认值)中,这通常意味着为将在多个类中使用的任何对象设置属性或ivar - 将一个对象指定为此对象的"所有者".然后它将与"拥有"它的对象一起被释放.

了解Objective-C内存模型和ARC工作方式的一个好方法是尝试在宠物项目上使用手动内存管理(至少有2个或3个视图控制器).一旦您熟悉手动内存管理,ARC将非常简单,并且可以节省您的时间,打字并防止忘记释放已分配的对象.大多数/所有Objective-C基础知识书籍将涵盖内存管理.(我现在忘记了我读过的那个名字).

共同的原因

假设你有一个UIViewController和一个你想在当前视图控制器中呈现的视图...其分配如下:

UIViewController* anotherController = [UIViewController make];
[self.view addSubView anotherController.view];
Run Code Online (Sandbox Code Playgroud)

'anotherController'现在将被释放,因为它不再使用.如果anotherController.view具有对anotherController的unsafe_unretained引用,则它将导致exc_bad_access.

无限递归:

EXC_BAD_ACCESS的另一个原因是无限递归,可以通过添加一些日志语句来调试 - 它很快就会变得明显!

  • 这是很好的解释..但在我的情况下,我只是清理并重新构建再次解决了我的问题。注意:我使用 swift 4、xcode 9.2,我的问题是由结构引起的。 (3认同)
  • 谢谢,我会调查一下。另外,如果您可以上传一个简单的示例,它将大有帮助。 (2认同)