发布后将指针设置为nil?

时间:2009-09-13 22:16:40

标签: objective-c

释放对象后最好将指针设置为nil?多数民众赞成我一直在做的事情,只是想问一下它是否必要,良好做法或过度杀伤?

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

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

欢呼 - 加里 -

4 个答案:

答案 0 :(得分:20)

取决于保存指针的变量的范围。如果它们继续存在于范围内,我总是将指针设置为nil,以防我在其他地方再次调用变量。否则,我将有可能访问包含现在已释放的对象的内存位置。

但是如果变量超出范围,那么它也不会被使用,因此为它分配nil有点矫枉过正。尽管如此,只是在其他人决定将代码添加到您的代码中并在其范围内再次使用该变量但在其被释放之后,分配nil是一个好习惯。

答案 1 :(得分:6)

通常在使用C / C ++进行编程时,我将其设置为null。为什么?因为即使你释放被指向的内存,指针仍然保存释放的内存的地址。它可能会在以下代码中导致严重的访问冲突问题:

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

如果您将指针设置为null,则不会发生这种情况

答案 2 :(得分:1)

这被认为是一种很好的做法。如果在释放它们之后将指针设置为 nil ,那么如果您在稍后的执行点滥用变量,则会收到正确的错误。

答案 3 :(得分: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