1

這是我早就應該清除的事情,但我只需要知道在以下情況下釋放的最佳做法。取消分配IBOutlet和實例變量

在我的頭文件,我宣佈一個IBOutlet參考如下:

@interface Test : UIViewController { 
    UIButton *_loginBtn; 
} 

@property (nonatomic, retain) IBOutlet UIButton *loginBtn; 

而且在實現文件我的實例變量的財產關聯和釋放如下:

@implementation Test 

@synthesize loginBtn = _loginBtn; 

... 

- (void) dealloc { 
    [_loginBtn release]; 
    self.loginBtn = nil; 

    [super dealloc]; 
} 

- (void) viewDidUnLoad { 
    [_loginBtn release]; 
    self.loginBtn = nil; 

    [super viewDidUnLoad]; 
} 

我正確的解除分配實例變量並將屬性設置爲nil並在viewDidUnLoaddealloc方法中都這樣做?

+0

我真的期待[_loginBtn release];結合self.loginBtn = nil;墜毀。第一個將釋放該值,但保留該值。然後第二個將嘗試再次釋放該值,同時將其設置爲零。這將是一個雙重版本。 –

回答

2

有沒有需要self.loginBtn = nil;dealloc,上一行發佈它。最好不要使用該屬性在dealloc中釋放它。釋放vs設置屬性爲零的原因是setter是一個方法調用,並且該類正處於拆除過程中,並且事情可能不穩定。

viewDidUnLoad發佈的所有屬性IBOutlet s與self.theOutlet = nil;,在這種情況下_loginBtn release];是不需要和冗餘的。還可以釋放任何其他可輕鬆重新創建的對象。

如果使用屬性,它們應該用於類中的所有訪問,但有兩個例外:init和dealloc。在這兩種情況下,班級都部分完成。在這兩種情況下,最好直接在init(如有必要)和releasedealloc中直接使用伊娃。

+0

非常感謝CocoaFu! – bennythemink

+0

我應該只是在viewDidUnLoad中將IBOutlets設置爲nil,還是應該將數組等屬性設置爲nil(再次在viewDidUnLoad中)? – bennythemink

+0

這裏的主要問題是內存和內存警告。在內存警告中,系統可能會卸載未顯示的視圖以釋放所需的內存。最簡單的方法是將IBOutlets設置爲零,釋放它們,系統將在重新加載視圖時重新加載它們。如果你有很容易重新創建的對象,考慮釋放它們,你將不得不在viewDidLoad中重新創建它們。你對內存情況的幫助越多,你的應用居住在後臺等待再次運行的時間就越長。 – zaph

1

不,這是不正確的。首先釋放_loginBtn,然後將該屬性設置爲零,然後釋放實例兩次。正確的方法是釋放_loginBtn,然後將_loginBtn設置爲零。

+0

非常感謝rasmus! – bennythemink

+0

不客氣。請注意,因爲我不能評論其他答案。在許多情況下,最好是調用release來代替賦值給屬性,因爲屬性中的版本是使用autorelease來實現的,這會延遲釋放並導致開銷。我會選擇釋放,然後將本地設置爲零,以避免使用屬性的dealloc方法的後期部分發生意外。 – rasmus