【问题标题】:Objective C: How to tell if an object is NSZombie now目标 C:如何判断一个对象现在是否是 NSZombie
【发布时间】:2011-05-31 05:01:55
【问题描述】:

我设置了NSZombieEnabled=YES,我想做下面的代码

- (NSString*) udid
{
    if (udid == nil) 
    {
        udid = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"UDID=%@", udid);
    }
    return udid;
}

udid 被“释放”时,它被替换为僵尸,而不是nil。所以我想做类似的事情

if (udid == nil || [udid isZombie])
{
    udid = [[UIDevice currentDevice] uniqueIdentifier];
    NSLog(@"UDID=%@", udid);
}

我试过[udid isKindOf:[NSZombie Class]],但NSZombie 不存在。那么我怎么知道udid 对象现在是僵尸呢?

【问题讨论】:

  • this question的答案对你有帮助吗?
  • @Chris,不,它没有。我知道如何启用NSZombieEnabled,谢谢。
  • Mike Ash 写了一篇关于僵尸的有用文章:mikeash.com/pyblog/…

标签: objective-c nszombie


【解决方案1】:

任何给僵尸的消息都会停止程序。

选择一个不应该有副作用的,比如self

[udid self] // program will halt here if it's a zombie

当僵尸狩猎似乎毫无意义时,任何其他调试或编写程序的方法。也就是说,僵尸程序不存在于正确编写的程序中,它们只存在于非常特定的仅调试条件下。

【讨论】:

  • 我想我明白了,对我来说最好的选择是找出它为什么变成僵尸并修复它,对吧?
【解决方案2】:

释放对象时,指向对象的指针永远不会设置为零。指针继续指向它一直指向的相同内存位置。然而,这并不意味着现在在该位置的任何东西都是有效的对象。出于这个原因,在释放指针指向的对象后,您永远不应该使用指针。如果您要继续使用该指针,您应该更改它的值,使其为 nil 或指向其他(有效)对象。

NSZombieEnabled 只是一个调试工具,可帮助您在代码中找到访问无效对象的位置。如果您找到了执行此操作的地方,那么您在代码中发现了一个错误,您需要修复它,而不是容忍它。

更改您的代码,以便在发布后正确地将 udid 指针设置为 nil。

【讨论】:

  • 我在一个单例类中有这个,我不知道它为什么被释放,我可能需要发布另一个关于静态对象内存管理的问题。那么有没有办法告诉([udid isNotInited] || [udid isReleased])而不将其设置为nil?
  • @Zhao,你总是可以在你的单例类中覆盖 -release 并在其中放置一个断点,这样你就可以知道它在哪里被释放。但是,IMO,您的其余代码仍应遵循正常的内存管理规则,而不是依赖 udid 作为单例。
  • Caleb:您的回答是“正确的做法”,但没有回答问题。我正在尝试插入测试/调试代码以确定变量在哪些代码路径下变成僵尸,问题仍然存在:我该如何做相当于if ([myObj isKindOfClass: [NSZombie Class]])...? (可以看到这在教程代码中也很有用。)谢谢!
猜你喜欢
  • 2015-03-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2012-10-16
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多