2009-10-01 91 views
7

如果在創建對象時創建了一個包含兩個對象指針的新對象(請參見下文),則指針設置爲指向零;好的,釋放一個指針,它是否?

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

如果(由於某種意外原因)我不分配這些指針,後來釋放他們在我的dealloc方法是好的,我敢肯定它,只是想檢查?

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

加里

+2

記得在'dealloc'實現結束時調用'[super dealloc]'。 – Jason 2009-10-01 12:53:48

+0

對不起傑森,我確實知道,但不知何故,它在切割和粘貼中迷失了方向。 – fuzzygoat 2009-10-01 13:43:03

回答

22

發送消息到零將不會導致錯誤,所以這是好的。你需要確保指針實際上是零 - 發送消息到垃圾指針可能會導致錯誤。

7

是的,你可以這樣做,因爲你可以安全地發送一條消息(如release)到nil,它什麼都不會做。

1

如果使用訪問屬性來創建你的get/set方法:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

而在你的.m文件:

@synthesize name; 
@synthesize thrust; 

然後,您可以只是你的變量設置爲零的dealloc中。這實際上會調用您的setter並將引用計數減1並清理乾淨。

+0

文森特,這是一個很好的觀點,我現在只是閱讀@property&@synthesize。我只是想在我更加朝Objective-C 2.0 – fuzzygoat 2009-10-01 13:45:47

+1

的方向努力爭取老派。作爲一個澄清,你必須在dealloc中編寫self.name = nil。除了GC以外,簡單設置name = nil將是泄漏。 – sbooth 2009-10-01 14:28:32

+3

雖然它可以在最簡單的情況下工作,但文森特的建議並不是最佳實踐。在dealloc方法中使用'self.name = nil'會調用你的setter方法。如果一個子類(或者你)覆蓋了這個setter方法,使得它有副作用或者取決於實例狀態,那麼當從dealloc中調用實例狀態沒有確定時,它可能會中斷。調用[名稱發佈]可能會更好。 – 2009-10-01 16:29:22

0

在Objective-C中區分對象和變量很重要。你不能釋放一個指針(一個變量的值),你只能釋放一個對象(指針指向的對象)。零指針指的是沒有對象,所以發送給nil的消息什麼都不做(這通常是安全的)。