2011-02-15 32 views
0

我將變量設置爲IBOutlet。 並使用@property(retain)@synthesize在我的.h.m文件中。 像這樣:當我釋放對象時,viewDidUnload和dealloc函數之間的區別

@interface testViewController { 

    NSArray *keys; 

} 

@property (nonatomic, retain) NSArray *keys; 

@end 

@implementation SectionViewController 

@synthesize keys; 

在很多書,他們設置對象爲nil在viewDidUnload方法和使用的排放方法來釋放對象dealloc方法。 像這樣:

- (void)viewDidUnload { 
    self.keys = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
    [keys release]; 
} 

據我所知,如果我使用self.keys =零,結果是相同[keys release]dealloc方法;對象鍵將release,和「無」將不被保留。

爲什麼有些書每次都使用這種形式?

感謝

回答

5

首先,你-dealloc將崩潰。您已將該電話打到[super dealloc]錯誤的地方。調用[super dealloc]將導致你的對象被釋放,所以在這次調用之後對ivars的任何引用都引用了垃圾內存。相反,你應該重寫這是

- (void)dealloc { 
    [keys release]; 
    [super dealloc]; 
} 

現在回答你的問題。看來你想知道爲什麼人們在某些地方說self.keys = nil,但在dealloc中使用[keys release]。有幾個很好的理由。首先是某人(一個同事,幾個月後你的自己,或者一個用戶,如果你開源代碼的話)可以在這個類中或者在一個子類中覆蓋setter -setKeys:。該設置者可能會假設該對象的狀態在-dealloc中無效(例如,假定其他ivars /屬性仍包含有效值)。如果做出這樣的假設,那麼在-dealloc中調用setter並不安全。難以追蹤的另一個原因是某人可能在您的物品上有關鍵值觀察註冊,對於@"keys"。調用self.keys = nil將觸發KVO通知,這不是您想要在dealloc中執行的操作。但是,說[keys release]將完全跳過KVO通知。

+0

相關知識鍵值觀察,謝謝! – Nianliang 2012-06-16 15:32:35

相關問題