2009-09-13 42 views
15

释放对象后最好是将指针设置为零?那就是我一直在做的,只是想问一下它的必要,好的做法还是矫枉过正?发布后设置指针为零吗?

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

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

欢呼-gary-

回答

20

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

但是,如果变量超出范围,那么它也不会被使用,因此赋值为零有点矫枉过正。尽管如此,为了防止别人决定将代码添加到代码中并偶然在该作用域内但在释放后再次使用该变量,最好指定nil是一个好习惯。

+1

谢谢,非常感谢。 – fuzzygoat 2009-09-13 22:25:35

+0

我已经看到一些代码,其中人们设置为零然后释放。这导致[无释放],它什么都不做。所以对于那些想知道订单是否重要的​​人来说,是的! – pnizzle 2015-02-27 06:55:50

1

它是好的做法。如果您在释放它们后将指针设置为,那么万一您在稍后的执行阶段误用了您的变量,则会得到适当的错误。

6

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

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

如果您曾将指针为null,这绝不会发生

0

有时,这可能是至关重要的,因为我刚刚发现。我在我的游戏中使用了一个相机,它保持了一个指向通用目标的指针。如果你从一个关卡返回到主菜单,它将从内存中清除关卡,但保留相机和游戏图层。

-(void) dealloc { 
    [target release]; 
    target = nil; 
    [super dealloc]; 
} 

由于相机会存在长于目标,最好设定目标为nil,否则当再次水平荷载并设置一个新的目标:

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

它会崩溃上如果目标是垃圾而不是零,则释放。向nil发送消息很好,但不适用于某些任意的垃圾内存。这给了我一个EXC_BAD_ACCESS