EXC_BAD_ACCESS使用ARC并且无法在模拟器上跟踪

问题描述:

我一直在为客户端构建应用程序,一切都很顺利,直到我开始出现此错误。这是一个独特的情况,我已经学会了如何使用乐器和NSZombie,但是我不能在模拟器上使用iPhone上的NSZombieEnabled来运行乐器。我必须在iPhone中调试此问题,因为我使用UIImagePicker拍摄照片,并在拍摄照片后不久发生错误。我也使用ARC,因此我无法设置发布或保留信息,ARC禁止它,所以我怀疑它是双发布还是类似的东西。这个问题有两个可能的答案。EXC_BAD_ACCESS使用ARC并且无法在模拟器上跟踪

1:有谁知道我是否可以使用照相亭将图像传递到UIImagePicker?如果我可以通过相机屏幕,我可以使用乐器和NSZombie。

2:是否有一种方法来检测哪些行会导致错误,而不用重构或注释掉使用iPhone的代码?有没有人知道有效的方法来追踪iPhone上的bad_acces?

请记住,我正在使用ARC,无法在模拟器上进行调试。如果我拿出UIImagePicker控制脚本,这个错误不会发生,所以我将它缩小到我的CameraViewController类中。恐怕由于先前存在的合同,我无法发布任何代码,您必须成为员工才能查看源代码。

对不起,关于有限的信息,但真的我正在寻找关于调试的答案,而不是直接解决我的确切代码问题。

要张贴回溯(我认为)

(gdb) bt 
#0 0x339737e4 in objc_msgSend() 
#1 0x31b30140 in -[UIApplication sendAction:to:from:forEvent:]() 
#2 0x31b300e0 in -[UIApplication sendAction:toTarget:fromSender:forEvent:]() 
#3 0x31b300b2 in -[UIControl sendAction:to:forEvent:]() 
#4 0x31b2fe04 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#5 0x31b30452 in -[UIControl touchesEnded:withEvent:]() 
#6 0x31b2eddc in -[UIWindow _sendTouchesForEvent:]() 
#7 0x31b2e756 in -[UIWindow sendEvent:]() 
#8 0x31b299fe in -[UIApplication sendEvent:]() 
#9 0x31b29336 in _UIApplicationHandleEvent() 
#10 0x3026c04a in PurpleEventCallback() 
#11 0x3443fce2 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__() 
#12 0x3443fca6 in __CFRunLoopDoSource1() 
#13 0x3443256c in __CFRunLoopRun() 
#14 0x34432276 in CFRunLoopRunSpecific() 
#15 0x3443217e in CFRunLoopRunInMode() 
#16 0x3026b5f2 in GSEventRunModal() 
#17 0x3026b69e in GSEventRun() 
#18 0x31ad0122 in -[UIApplication _run]() 
#19 0x31ace12e in UIApplicationMain() 
#20 0x000034ce in main (argc=1, argv=0x2ffff75c) at /Users/Andrew/Documents/Developing/Xcode Projects/ProjectSVN/Project/trunk/ProjectInterface/ProjectInterface/main.m:16 
+2

在模拟器上,您可以(暂时)更改代码以从中选择照片库,而不是 - 你应该能够调试它然后(这也将有助于缩小你的bug的地方:) – deanWombourne 2012-07-20 16:47:42

+0

它打开照片库,以取代在模拟器上的相机,我怎么能添加一张照片? – Xav 2012-07-20 17:27:32

+0

将图像拖放到模拟器上 - 这将在Safari中打开。长按图片,你可以选择保存。 – deanWombourne 2012-07-20 17:28:56

没有代码示例很难说,但ARC并不完全覆盖您的所有基础。例如,当对象(具有委托的类)不存在时,可能会得到这些EXC_BAD_ACCESS错误,但尝试执行回调委托方法。

更具体地说,假设我在viewDidLoad:中创建了一个类 - 我们称之为ClassA。在我的假设情况下,我将我的视图控制器设置为ClassA的代表。不过,我还没有申报财产ClassA,所以没有提及它超出viewDidLoad:的范围。

现在让我们假设ClassA声明由我的视图控制器实现的委托方法。此代理将此自身的引用传递回此代理方法中的视图控制器。因为它可能会或可能不会超出范围,BOOM,访问错误不好。检查诸如此类的东西,哪些对象不再存在,并且正在传递给其他方法 - 它就是ARC可以让你失败的一种方式;)

+0

这听起来非常接近我的问题,我是xCode的新手,所以我仍然很缺乏经验。指向一个对象并连续传递给3个独立的类。也许这是因为分配指针的类被释放并且指针被破坏了吗?我可以传递实际的对象吗?不是指针? – Xav 2012-07-20 17:03:06

+0

我怀疑这一点。如果委托没有连接起来,它可能不会崩溃,只会有没有回调功能。确保当你传递一个对象到许多地方,它坚持超越了它正在做的这个方法。 – bgoers 2012-07-20 17:32:26

+0

好吧,这实际上是确切的问题,是新的xCode我已经初始化5个不同的类没有属性在我的方法在我的的viewController。我所做的只是添加类和Booyah的属性!感谢大家帮助我,从这篇文章中学到了很多东西。 – Xav 2012-07-20 19:13:19

EXC_BAD_ACCESS并不一定意味着一个内存管理问题。它可能很容易造成内存损坏或其他类型的错误。

发布崩溃的回溯。

+0

我对xCode真的很陌生,我可以在xCode 4.2中获取回溯吗?对不起,我还是CS的初级并且已经在目标文件中写了不到一个月的时间 – Xav 2012-07-20 17:04:06

+1

不用担心,我们都在那里一次(或两次)当你的应用程序崩溃时,你应该放到Xcode中的调试器提示符中输入'bt '和将输出粘贴到你的问题中作为代码 – bbum 2012-07-20 17:07:12

+0

heh,我第一次输入 D'OH! – Xav 2012-07-20 17:20:20