在研究了这个错误后,我注意到它是特定于代码的但是我尝试制作,加载等的任何项目都一直给我同样的错误,并且总是引用代码的不同部分,但是由于初始程序我设置,具有确切的默认代码,没有更多,仍然收到相同的错误,我不会看到如何添加我的错误日志可以帮助。请注意,在Xcode 5中使用精灵工具包时会出现此错误,并且我在os x 10.8.5上运行此错误,感谢您的耐心,洞察力和希望的答案。
答案 0 :(得分:10)
exc_bad_access通常由所谓的悬空指针引起 - 访问已经解除分配的对象。
要进行调试,请通过以下任一方式启用僵尸对象:
花一些时间学习Objective-C引用计数内存模型 - 保留,释放,保留周期和自动释放池。
您需要确保您的对象在被使用时保留。在ARC(自动引用计数 - iOS的默认值)中,这通常意味着为将在多个类中使用的任何对象设置属性或ivar - 将一个对象指定为此对象的“所有者”。然后它将与“拥有”它的对象一起被释放。
了解Objective-C内存模型和ARC工作方式的一个好方法是尝试在宠物项目上使用手动内存管理(至少有2个或3个视图控制器)。一旦您熟悉手动内存管理,ARC将非常简单,并且可以节省您的时间,打字并防止忘记释放已分配的对象。大多数/所有Objective-C基础知识书籍将涵盖内存管理。 (我现在忘记了我读过的那个名字)。
常见原因
假设你有一个UIViewController和一个你想在当前视图控制器中呈现的视图。 。 。其分配如下:
UIViewController* anotherController = [UIViewController make];
[self.view addSubView anotherController.view];
'anotherController'现在将被释放,因为它已不再使用。如果anotherController.view对anotherController有unsafe_unretained引用,它将导致exc_bad_access。
无限递归:
EXC_BAD_ACCESS的另一个原因是无限递归,可以通过添加一些日志语句来调试 - 它很快就会变得明显!