通过工具跟踪“发送到解除分配实例的消息”

时间:2011-11-26 02:11:52

标签: iphone xcode exc-bad-access instruments

在XCode 4.2中,我需要一些帮助,以跟踪EXC_BAD_ACCESS错误的原因。启用NSZombie标志后,当应用程序在设备上崩溃时,我在控制台上看到以下内容。

*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x8674e30

我使用了乐器,但没有看到Zombie的个人资料。我使用了Allocations配置文件,但很快就输了。我为应用程序启用了ARC(希望摆脱alloc / retain / release) - 但仍然遇到同样的问题。

如何使用Instruments跟踪此情况?

5 个答案:

答案 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),然后使用“泄漏”工具。
Leaks tool screenshot
在内部单击泄漏部分,然后选中Gather Leaked memory content复选框 properties screenshot祝你好运。

答案 3 :(得分:0)

在模拟器上使用zombies profilier查看我的answer。基本上你应该能够使用profilier:

  1. 将运行模式更改为个人资料。
  2. 从列表中选择Zombies。
  3. 当它缓存僵尸时,双击右侧的堆栈跟踪以查看对象生命周期的不同部分。

答案 4 :(得分:0)

使用命令:

Shell malloc_history process_id memory

例如。 Shell malloc_history process_id 0x11afab80

启用以下内容1)MallocstackLogging 2)NsDebugEnabled 3)NSZombieEnabled

这将解决问题