目标C:如何判断对象现在是否为NSZombie

时间:2011-05-31 05:01:55

标签: objective-c nszombie

我已设置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对象现在是僵尸?

2 个答案:

答案 0 :(得分:4)

任何发送给僵尸的消息都会暂停该程序。

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

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

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

答案 1 :(得分:3)

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

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

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