释放后将指针设置为nil吗?

15

在释放对象后,最好将指针设置为nil吗?这是我一直在做的,只是想问一下是否必要、是否是良好的实践或者是否过度处理了?

- (void)dealloc{
    [planetName release]; // NSString instance variable
    [super dealloc];
}
@end

.

- (void)dealloc{
    [planetName release]; // NSString instance variable
    planetName = nil;
    [super dealloc];
}
@end

干杯 -gary-


精确副本:<a href="https://dev59.com/T3RA5IYBdhLWcg3w2xwI">在释放后,Objective-C中是否有必要将指针设置为nil?</a> - James
4个回答

20

根据持有指针的变量的作用域而定。如果它们在作用域内仍然存在,我总是将指针设置为nil,以防我在其他地方再次调用该变量。否则,存在访问已释放对象的内存位置的风险。

但是,如果变量超出作用域,则也不会使用它,因此将其赋值为nil有点过度了。尽管如此,在别人决定向你的代码添加代码并在其范围内意外再次使用该变量时,只是分配nil是一个好习惯。


我看过一些代码,人们先将其设置为nil,然后再释放。这会导致[nil release],什么也不会发生。所以对于那些想知道顺序是否重要的人来说,是的,顺序很重要! - pnizzle

6

通常在C/C++编程中,我会将指针设置为null。为什么?因为即使您释放了指向的内存,指针仍然保留着那个已被释放的内存地址,这可能会导致类似这样的代码出现严重的访问冲突问题:

if(myPointer != null)
{
   doSomething(myPointer);
}

如果您将指针设置为null,这种情况就永远不会发生。

1

这被认为是一种良好的实践。如果你在释放指针后将其设置为nil,那么如果你在稍后的执行过程中误用变量,你将会得到一个适当的错误。


0
有时候这很关键,就像我刚刚发现的一样。我在我的游戏中使用相机来保持对一个通用目标的指针。如果你从一个地图返回到主菜单,那么它会清除记忆中的地图,但是保留相机和游戏层。
-(void) dealloc {
    [target release];
    target = nil;
    [super dealloc];
}

由于相机的存在时间比目标更长,最好将目标设置为nil,否则当关卡再次加载并设置新目标时:

-(void) setTarget:(CCNode *)aTarget {
    [target release];
    target = [aTarget retain];
    [self update:0];
}

如果目标是垃圾而不是nil,它将在该版本上崩溃。向nil发送消息是可以的,但不要发送到任意的垃圾内存。这会导致EXC_BAD_ACCESS错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接