NSZombieEnabled完全隐藏EXC_BAD_ACCESS错误

时间:2010-04-21 18:14:40

标签: iphone objective-c cocoa ipad

所以我有一个UIView的子类,当我经历一组特定的条件时(在iPad而不是iPhone或模拟器上运行,仅首次登录),它会开始导致EXC_BAD_ACCESS错误。它在UIView子类从池中自动释放时抛出异常(即池正在释放,而不是在我调用[view autorelease]时,在最后一行,我有[super dealloc]。)我听说过使用NSZombieEnabled,所以我把它扔了,看看我是否能得到更多关于它的信息,但现在它完全隐藏了错误!

有没有人比较了解这种情况?我以为NSZombie会像以前一样开始向我的控制台喷出东西,但是我希望错误的不存在也会告诉我某些信息。

- (void)dealloc  
{  
    [loadingLabel release];  
    [indicatorView release];  
    [super dealloc];  
} 

编辑:好的,所以我解决了潜在的问题:

我的一个属性是:
@property (nonatomic,retain) NSString * title;

但是,该属性的代码如下(loadingLabel是UILabel):

- (void)setTitle:(NSString *)title
{
    loadingLabel.text = title;
    [loadingLabel sizeToFit];
    [self setNeedsLayout];
}

- (NSString *)title
{
    return loadingLabel.text;
}

我实际上并没有保留任何东西,而只是做了一个UILabel.text,它是一个复制属性。所以我改变了我自己的title属性来反映这一点,错误消失了。

但是,我仍然不知道这个错误是如何或为什么首先出现的,以及为什么它只出现在iPad平台上(不是iphone,甚至是ipad模拟器)。

4 个答案:

答案 0 :(得分:1)

  

所以我有一个UIView的子类,当我经历一组特定的条件时(在iPad而不是iPhone或模拟器上运行,仅首次登录),它会开始导致EXC_BAD_ACCESS错误。它在UIView子类从池中自动释放时抛出异常(即池正在释放,而不是在我调用[view autorelease]时,在最后一行,我有[super dealloc]。)我听说过使用NSZombieEnabled,所以我把它扔了,看看我是否能得到更多关于它的信息,但现在它完全隐藏了错误!

您获得了EXC_BAD_ACCESS,因为您尝试使用死对象。

NSZombieEnabled使对象不会死亡。由于对象永远不会死亡,您的应用程序不会崩溃。相反,您将在控制台日志(在Xcode下运行时调试控制台)中收到一条消息,告诉您错误并建议设置断点。

更具体地说,NSZombie消息将告诉您发送消息的对象类以及发送消息的消息。如果您设置断点并在调试器处于活动状态时运行您的应用程序,则调试器将在此时中断(“中断”)您的应用程序,以便您可以环顾四周并查看 发送了zombie对象的内容消息。

  

我实际上并没有保留任何内容,而只是[分配给] UILabel.text,这是一个复制属性。

因此,这根绳子可能因为没有任何东西而死亡。使用NSZombieEnabled和上述技术,你可以确认它是过早死亡的字符串理论。

更好更简单的方法是使用Instruments的Zombies模板。而不是出现在Xcode的调试器控制台中的消息,标志将显示仪器的时间轴和信息。该标志将有一个go-to-iTunes-Store(➲)按钮,您可以单击该按钮以获取有关该问题的更多信息。

答案 1 :(得分:0)

你能否澄清 - 你的意思是你抛出一个EXC_BAD_ACCESS异常,或者你(故意)导致系统抛出一个EXC_BAD_ACCESS异常?你怎么做到这一点?请显示一些代码。如果您尝试在其上调用实例方法,NSZombie将向控制台吐出。你在做吗?

答案 2 :(得分:0)

NSZombie应该在发生崩溃的同一位置向控制台产生输出。

您是否尝试过使用ObjectAlloc工具运行Instruments,并在其中启用保留计数和僵尸检测(您需要在可执行文件中配置ObjectAlloc仪器,单击ObjectAlloc旁边的“i”)。当一条消息被发送给僵尸时,该仪器将标记一个特殊的弹出窗口,说明已检测到僵尸。

答案 3 :(得分:-1)

请记住,iPad SDK仍处于测试阶段,如果您确认这是一个错误,也许您应该向Apple报告此问题。不幸的是,根据我的经验,他们的bugtracker很糟糕。

NSZombie的行为是永远不会减少对象保留cound如果调用release。但是,它会跟踪将要保留的计数,并在控制台上删除后将对象记录到对象。它将对象地址与错误消息放在一起,与仪器一起,您可以轻松地在该地址找到对象,并确定它在哪里被分配以及谁保留/释放它。