2013-03-23 111 views
0

我在頭定義文件中的對象的對象:的Objective-C,正確釋放

@property (nonatomic, retain) UIBarButtonItem *printButton; 

實現文件:

@synthesize printButton; 

self.printButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)]; 
[self.view addSubview:printButton]; 
[printButton release]; // Should I release it here? 

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

我的問題是,我應該總是release/autorelease對象(宣佈爲保留屬性)之後I addSubview它,並且在dealloc中釋放它,即使我將在其他函數中使用它!

回答

2

爲了保持周圍,對象需要保留至少一次。不止一次是可以接受的,但關鍵是至少一次。通過保留,你說:'我需要這個可用',並通過釋放,你說'我不再需要它'。例如,在你被釋放後,保留比你需要的東西更長的時間是無禮和浪​​費的。這樣做是泄漏。

對於你的具體問題:如果你的財產被保留,那麼是的,你必須在某個時候釋放。在你的dealloc是一個好時機,或者在它被你擁有的東西再次保留是一個更好的時間之後。添加一個視圖到你的子視圖是添加一個對象到一個保留的數組(你的UIView超類保留了一系列子視圖)。數組本身保留了它的元素。因此,添加後發佈是很好的。此外,由於您知道您的子視圖數組,並且其內容在您的整個一生中都會保留下來,所以根本就不會保留您的副本。這就是子視圖網點通常被宣佈爲弱的原因。因此,我將做到以下幾點:

@property(nonatomic, weak) UIBarButtonItem *printButton; 

然後在初始化:

UIBarButtonItem *aPrintButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)]; 
// this is just a stack variable, retained because of the alloc 
[self.view addSubview:aPrintButton]; // this provides a second retain 
self.printButton = aPrintButton;  // this does not retain because it's setter is declared weak 
[aPrintButton release]; // release here subtracts one retain, leaving the one you need 

沒有更明確的版本是由你的子類必須的,因爲UIView將釋放它的子視圖陣列和NSArray會照顧照顧釋放它的元素。

2

當你不需要它們時,你應該釋放你的對象(如果不使用ARC的話)。在你的情況下,一旦添加視圖,你不再需要引用它(除非你打算在你的課堂上使用它,在這種情況下不要釋放它)。

由於@AndrewMadsen在評論中提及了你釋放你有一個所屬引用(通過明確留住他們,或使用newcopymutableCopyalloc方法得到的引用)的對象。

你可以找到更多信息here

+0

Downvoter請解釋...它的易於投票而沒有解釋。如果您認爲答案不正確,歡迎您對其進行編輯或張貼自己的答案。 – giorashc 2013-03-23 19:13:11

+0

我不是downvoter,但內存管理的細節並不像你的答案所表明的那麼簡單。你只應該釋放一個擁有引用的對象,這意味着你既可以保留它,也可以通過'new','copy','mutableCopy'或'init'方法獲得它。同樣,在OP的例子中,他們可以在將'printButton'分配給'self.printButton'之後立即釋放'printButton',因爲@property負責維護對它的強大(保留)引用。 – 2013-03-23 19:14:37

+0

@AndrewMadsen謝謝你,所以,即使我將在其他函數中使用它,也應該釋放它,導致self.printButton將照顧保留它?! – 2013-03-23 19:21:53

3

當你有一個propertyretain,它保留了新的價值,併發送release消息給舊值。您還需要release這個屬性在dealloc

正確的方法是做到這一點:

self.printButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)] autorelease]; 

而且self.view addSubView是保留子視圖和超級視圖負責釋放它。