Objective c 目标C:如何判断一个对象现在是否是僵尸

Objective c 目标C:如何判断一个对象现在是否是僵尸,objective-c,nszombie,Objective C,Nszombie,我已经设置了NSZombieEnabled=YESset,我想执行以下代码 - (NSString*) udid { if (udid == nil) { udid = [[UIDevice currentDevice] uniqueIdentifier]; NSLog(@"UDID=%@", udid); } return udid; } 当udid被“释放”时,它被一个僵尸所取代,而不是nil。所以我想做一些类似的事情 if

我已经设置了
NSZombieEnabled=YES
set,我想执行以下代码

- (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有点像:[NSZombie类]]
,但是
NSZombie
不存在。那么,我如何判断
udid
对象现在是僵尸呢?

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

NSZombieEnabled只是一个调试工具,可以帮助您在代码中找到访问无效对象的位置。如果您已经找到了这样做的地方,那么您已经在代码中发现了一个bug,您需要修复它,而不是容忍它


更改代码,以便在释放udid指针后将其正确设置为nil。

任何发送给僵尸的消息都将停止程序

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

[udid self]//如果是僵尸,程序将在此处停止


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

答案对你有帮助吗?@Chris,没有。我知道如何启用
NSZombieEnabled
,谢谢你。Mike Ash写了一篇关于僵尸的有用文章:我在一个单例类中有这个,我不知道为什么会发布它,我可能需要发布另一个关于静态对象内存管理的问题。因此,有没有办法告诉
([udid isNotInited]| |[udid isReleased])
,而不将其设置为nil?@Zhao,您可以在singleton类中重写-release,并在其中设置断点,这样您就可以找出它被释放的位置。然而,在我看来,您的代码的其余部分仍然应该遵循正常的内存管理规则,而不是依赖udid作为一个单例。我正在尝试插入测试/调试代码,以确定变量在什么代码路径下成为僵尸,问题仍然是:如果([myObj isKindOfClass:[NSZombie Class]])…,我如何做与
等价的事情?(你可以看到这在教程代码中是多么有用。)谢谢!我想我明白了,对我来说最好的选择就是找出它为什么会变成僵尸并修复它,对吗?