2012-02-15 109 views
0

內的初始化方法,我有以下的代碼非保留對象:何時被釋放?

- (id)init { 

    self = [super init]; 

    if (self) { 

     UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     tempButton.frame = CGRectMake(0,0,300,44); 

     // some custom code... 

     self.myButton = tempButton; 
    } 

    return self; 
} 

myButton是保留的財產。 我知道,對於所關注的內存管理規則,這種方法等於這個其他:

- (id)init { 

    self = [super init]; 

    if (self) { 

     UIButton *tempButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)]; 

     // some custom code... 

     self.myButton = tempButton; 
     [tempButton release]; 
    } 

    return self; 
} 

但在這種情況下,我需要使用的第一個「版本」,因爲buttonType屬性爲只讀後,我不能改變它使按鈕失去活力。

因爲我發現自己在我的應用程序和多個對象(其中大部分是NSString)的多個方法中使用「非init-release」版本,我的問題是:不計算在這種情況下,分配給屬性保留的對象,何時tempButton對象將被釋放?也許在方法/ if語句的末尾?或者,第一個「版本」會導致內存使用量增加,因爲該對象不會立即被釋放,而是在一段時間之後?

回答

1

我覺得你在這裏有點困惑:在你的兩個片段中,你創建了一個tempButton對象,但是你將它分配給self.myButton。此時,tempButtonself.myButton都是指向同一對象的指針。現在,大概你使用的是一個強大的屬性,所以通過給它分配tempButton,你增加了它的保留計數,因此在任何版本的代碼中,最後的保留計數都是+1,並且不會被解除分配。

如果,假設,myButton沒有一個強大的屬性,那麼就在你的代碼中的錯誤,並在這兩種情況下tempButton將被提前釋放和dealloc'ed。下面是在兩種情況下會發生什麼:

在你的第一個版本,因爲你得到tempButton來自比initcopy方法以外的東西,它得到+1保留計數,但會被自動釋放。在運行循環的當前迭代結束時,autorelease將啓動,使其保留計數爲0並導致它被釋放。

在第二個版本中,您首先得到保留數爲1的tempButton,因爲它來自init方法。但後來你明確地釋放它,將其保留計數設置爲0,此時立即釋放它。

+0

唉,我錯過了運行循環部分。你有可能對「運行循環的當前迭代」更精確嗎?那個迭代與單一方法或更長的時間相關,也許是固定的時間?可能是整個應用程序的生命週期?我試着通過閱讀教程來了解更多,但沒有人明確地解釋這一點。 – 2012-02-15 00:19:02

+0

「運行循環的當前迭代」實際上與我所能達到的一樣精確。運行循環是Cocoa中的事件處理循環。如果您想了解更多信息,請點擊以下博客文章:http://blog.shinetech.com/2009/06/02/run-loops-vs-threads-in-cocoa/ – yuji 2012-02-15 00:26:12

-1

非init方法是完全一樣的:

UIButton *tempButton = [[[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)] autorelease]; 

這樣的想法是,以瞭解更多關於自動釋放池是如何工作的,它是非常有用的大部分時間,但ü需要了解如何它的工作原理ü稍後將在應用程序中使用該對象。 並注意一些事情,當你添加臨時按鈕到你認爲該視圖將保留它,並將其釋放它時,你可以使用儀器和檢查對象的保留計數,如果你想查看如何釋放/如果你想要看到它在實施,保留正在進行。