2012-01-20 77 views
1

我保留對example對象的引用,但我從不使用retain,newcopy我是否需要釋放我不保留的對象?

@interface ExampleViewController : UIViewController 
{ 
    IBOutlet UILabel *example; 
} 

@end 

如果我在界面生成器連接UILabel對象example,保留計數爲兩個。但是,當我不連接它時,保留計數爲零。我會認爲我保留一個參考,並且觀點保持另一個參考,因此我需要發佈它。你怎麼看?

回答

2

IBOutlet實例變量是一種特殊情況。在iOS中,每個IBOutlet實例變量在加載NIB時都會保留,所以您需要自己釋放它們。

事實上,你應該特別注意在-viewDidUnload:之前發佈和刪除這些IBOutlets,否則當NIB重新加載時它們會泄漏。

請注意,這實際上與Mac OS X開發不同,其中IBOutlet不保留,除非它是沒有父視圖或窗口的頂級NIB對象。

因此,Apple現在建議通過屬性而不是實例變量公開IBOutlets。這樣,分銷商的所有權就明確界定了。

@property (nonatomic, assign) IBOutlet UIButton* myButton; 
@property (nonatomic, retain) IBOutlet NSObject* someObject; 

myButton不必被釋放; someObject將不得不被釋放。在這兩種情況下,您都有責任在-viewDidUnload:之間清理這些變量。

+0

還有兩個問題,你已經得到我的接受。 1。)爲什麼連接到視圖給它兩個保留計數,而不這樣做給我零?和2.)爲什麼我需要將IBOutlets設置爲零? –

+0

你在你的問題中獲得了retainCount權利;一個參考是由你,另一個由超級觀點。 retainCount從不爲零。如果你讀了零就意味着該變量爲零。釋放它之後,您應該始終爲零。這就是你知道變量不再指向有效對象的方式。沒有這個,你會有一個懸掛指針指向一個不再存在的對象。 – Darren

+0

最後一個問題,所以我必須始終將我的IBOutlet實例變量設置爲零,然後才能釋放其他對象? –

1

如果你使用的是ARC,那麼你不需要釋放一個實例變量,因爲它將在你的實例被釋放時被釋放。如果你不使用ARC,你應該寫在你的ExampleViewController方法-dealloc這樣:

- (void)dealloc 
{ 
    [example release]; 

    [super dealloc]; 
} 

請注意,如果您手動設置example不使用ARC,它不會自動保留。但是,由於您使用的是筆尖,因此在設置時會保留

+0

有道理。但是,爲什麼筆尖保持對象兩次? –

+0

它不會保留它們兩次。它將它設置爲實例變量時保留該對象。該對象的*也*由其超視圖保留,因此您可以預期在顯示視圖時保留計數爲2,當視圖解除分配或從超級視圖中移除該對象時爲1,並且一旦視圖控制器被釋放。 –

0

你需要的,如果你不使用ARC釋放他們在- (void) dealloc,有一個屬性你IBOutlet,你需要釋放和nil他們viewDidUnload:

考慮爲您的項目使用ARC(自動保留計數)。使用ARC,編譯器負責保留計數,因此您不必實際不允許這樣做。有一個重構將轉換當前的項目。

+0

我沒有iOS 5 SDK。 –

+0

爲什麼你不明白它?除了少數例外,ARC與iOS 4兼容。 –

+0

我沒有這臺機器的管理權限,而且那些更新軟件的速度非常慢。 –

相關問題