2012-05-18 40 views
0

一個簡單的內存管理問題如下:根據管理協議爲什麼「黃金」的全局變量應該自動釋放

-(void)viewDidLoad 
{ 
    ...... 
    self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 
    ...... 
} 

我覺得標籤是一個全局變量,如果你創建一個實例與「黃金「,你應該」釋放「它,爲什麼在這裏」autorelease「?

回答

1
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 

UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame]; 
self.label = temp; 
[temp release]; 

基本上是相同的,只要正確的內存管理去。內存將在不同的時間正確清理。

我認爲該標籤的屬性應該與@property(nonatomic,retain)類似,所以標籤繼續存在,因爲當您撥打self.label時,該標籤將保留該屬性。

+0

這些都差不多。在第二個片段中,如果setLabel:做了一個副本呢?現在你已經從'[[UILabel alloc] initWithFrame:labelFrame]'泄露了標籤,然後在你的實例變量中過度發佈了標籤。一定要小心準確地發佈你想要發佈的內容! – jfortmann

+0

如果屬性是'retain'或'copy',你是否需要在'dealloc'中再次釋放標籤?在執行代碼後,使用第二行會給它一個保留計數1 - 一個用於alloc,一個來自屬性調用,一個來自發行版。 – jmosesman

+0

如果您的財產之前沒有「保留」或「複製」,那麼第一個變體將被過度發佈。但是,是的,如果你的財產被標記爲「retain」或「copy」,那麼如果你不使用ARC,你必須在dealloc中釋放它。 爲了得到第二個模式,你會做 'UILabel * someLabel = [[UILabel alloc] initWithFrame:labelFrame]; self.label = someLabel; [somelabel release];' – jfortmann

0

自動釋放是推動你的變量中池列表在未來發布:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
// your code 
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 
// your code 
[pool release]; 

那麼你不需要調用

[self.label release]; 

因爲變量會被自動釋放。並在代碼行

[pool release]; 

將成功發佈。

這是泄漏踢腳

4

我覺得標籤是一個全局變量...

沒有,label是包含您發表的證明代碼的類的屬性self.label語法。它由一個實例變量支持,無論是顯式聲明的還是非聲明的。 label屬性的setter負責確保傳入的值得到適當保留。分配UILabel的代碼-viewDidLoad負責釋放它,這是autorelease的呼叫所做的。

...根據管理協議,如果你創建一個實例與 「黃金」,你應該「的dealloc」這......

這是不正確。您從不直接致電-dealloc--當您完成使用您創建的對象時,請始終致電-release-autorelease。詳細信息請參見memory management rules

0

Self.label是一個屬性。

的UILabel * tempLabel = [[的UILabel的alloc] initWithFrame:方法labelFrame] - >保留計數爲1

self.label = tempLabel - >擋計數現在是2

但是,你只能使用自我。標籤,所以如果你不使用autorelease或發佈你創建的標籤,你會得到內存泄漏問題;)

相關問題