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]])…,我如何做与等价的事情?(你可以看到这在教程代码中是多么有用。)谢谢!我想我明白了,对我来说最好的选择就是找出它为什么会变成僵尸并修复它,对吗?