2

我已经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物体现在是僵尸呢?

4

2 回答 2

4

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

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

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

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

于 2011-05-31T05:21:37.310 回答
3

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

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

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

于 2011-05-31T05:14:58.610 回答