1

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

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
4

2 回答 2

2

EXC_BAD_ACCESS不一定意味着内存管理问题。它也很容易由内存损坏或其他类型的错误引起。

发布崩溃的回溯。

于 2012-07-20T16:45:01.833 回答
0

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

更具体地说,假设我已经创建了一个类viewDidLoad:- 我们称之为ClassA。在我假设的情况下,我将我的视图控制器设置为ClassA的委托。但是,我没有为 声明一个属性ClassA,所以没有超出范围的引用viewDidLoad:

现在让我们假设ClassA声明一个由我的视图控制器实现的委托方法。此委托将自身的引用传递回此委托方法中的视图控制器。因为此时它可能会或可能不会超出范围,BOOM,错误的访问错误。检查诸如此类的事情,其中​​对象不再存在并被传递给其他方法 - 这是 ARC 可能会让您失败的一种方式;)

于 2012-07-20T16:46:03.580 回答