在XCode 4.2中,我需要一些帮助,以跟踪EXC_BAD_ACCESS错误的原因。启用NSZombie标志后,当应用程序在设备上崩溃时,我在控制台上看到以下内容。
*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x8674e30
我使用了乐器,但没有看到Zombie的个人资料。我使用了Allocations配置文件,但很快就输了。我为应用程序启用了ARC(希望摆脱alloc / retain / release) - 但仍然遇到同样的问题。
如何使用Instruments跟踪此情况?
答案 0 :(得分:9)
你的视图层次结构中是否有* UIScrollView *,你是否发送了诸如scrollToVisibleRect之类的消息:动画:?
如果是这样,请尝试为动画参数传递NO。看来iOS5可能在滚动视图和嵌入式动画方面存在一些问题。你看到的同样的崩溃让我疯狂了几天(没有可用的调用堆栈),我最终将其缩小到滚动视图调用。 希望它有所帮助。
答案 1 :(得分:2)
我遇到了同样的问题。起初我使用了Raffaello Colasante的解决方案并将NO
传递给scrollRectToVisible:animated:
。但后来我注意到这个方法是在另一个线程上处理的。
您应该检查是否在主线程上调用[uitableview scrollRectToVisible: CGRectMake(0,0,1,1) animated:YES]
(所有ui操作都应在主线程上执行)。我更改了我的代码,以便在主线程上调用它。
自:
//method called not from main thread
...
[someObjectInstance setOptionalActions:optActions];
要:
//method called not from main thread
...
dispatch_async(dispatch_get_main_queue(), ^{
//now method called from main thread
[someObjectInstance setOptionalActions:optActions];
});
注意:(setOptionalActions :) call - > ( scrollRectToVisible:动画:)
现在问题已解决。
P.S。您可以使用Grand Central Dispatch(GCD):
,而不是使用another approach@implementation SomeObjectClass
...
- (void) setOptionalActions:(NSArray *) actionsArray {
... // handling of array
[myTableView scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];
}
...
@end
//method called not from main thread, but will be performed on main thread
[someObjectInstance performSelectorOnMainThread:@selector(setOptionalActions:) withObject:optionalActions waitUntilDone:NO];
答案 2 :(得分:1)
使用乐器配置或运行(命令+ I),然后使用“泄漏”工具。
在内部单击泄漏部分,然后选中Gather Leaked memory content复选框
祝你好运。
答案 3 :(得分:0)
在模拟器上使用zombies profilier查看我的answer。基本上你应该能够使用profilier:
答案 4 :(得分:0)
使用命令:
Shell malloc_history process_id memory
例如。 Shell malloc_history process_id 0x11afab80
启用以下内容1)MallocstackLogging 2)NsDebugEnabled 3)NSZombieEnabled
这将解决问题