我已设置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
对象现在是僵尸?
答案 0 :(得分:4)
任何发送给僵尸的消息都会暂停该程序。
选择一个不应有副作用的,例如self
:
[udid self] // program will halt here if it's a zombie
当僵尸狩猎看起来毫无意义时,调试或编写程序的任何其他方法。也就是说,僵尸在正确编写的程序中不存在,并且它们仅存在于非常特定的仅调试条件下。
答案 1 :(得分:3)
释放对象时,指向对象的指针永远不会设置为nil。指针继续指向它始终执行的相同内存位置。但这并不意味着现在在该位置的任何东西都是有效的对象。因此,在释放指向的对象后,切勿使用指针。如果您要继续使用该指针,则应更改其值,使其为nil或指向其他(有效)对象。
NSZombieEnabled只是一个调试工具,可以帮助您在代码中查找访问无效对象的位置。如果你找到了一个你正在做的地方,你在代码中发现了一个错误,你需要修复它,而不是容忍它。
更改代码,以便在释放后正确将udid指针设置为nil。