一個簡單的內存管理問題如下:根據管理協議爲什麼「黃金」的全局變量應該自動釋放
-(void)viewDidLoad
{
......
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
......
}
我覺得標籤是一個全局變量,如果你創建一個實例與「黃金「,你應該」釋放「它,爲什麼在這裏」autorelease「?
一個簡單的內存管理問題如下:根據管理協議爲什麼「黃金」的全局變量應該自動釋放
-(void)viewDidLoad
{
......
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
......
}
我覺得標籤是一個全局變量,如果你創建一個實例與「黃金「,你應該」釋放「它,爲什麼在這裏」autorelease「?
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
與
UILabel *temp = [[UILabel alloc] initWithFrame:labelFrame];
self.label = temp;
[temp release];
基本上是相同的,只要正確的內存管理去。內存將在不同的時間正確清理。
我認爲該標籤的屬性應該與@property(nonatomic,retain)
類似,所以標籤繼續存在,因爲當您撥打self.label
時,該標籤將保留該屬性。
自動釋放是推動你的變量中池列表在未來發布:
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// your code
self.label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
// your code
[pool release];
那麼你不需要調用
[self.label release];
因爲變量會被自動釋放。並在代碼行
[pool release];
將成功發佈。
這是泄漏踢腳
我覺得標籤是一個全局變量...
沒有,label
是包含您發表的證明代碼的類的屬性self.label
語法。它由一個實例變量支持,無論是顯式聲明的還是非聲明的。 label
屬性的setter負責確保傳入的值得到適當保留。分配UILabel的代碼-viewDidLoad
負責釋放它,這是autorelease
的呼叫所做的。
...根據管理協議,如果你創建一個實例與 「黃金」,你應該「的dealloc」這......
這是不正確。您從不直接致電-dealloc
--當您完成使用您創建的對象時,請始終致電-release
或-autorelease
。詳細信息請參見memory management rules。
Self.label是一個屬性。
的UILabel * tempLabel = [[的UILabel的alloc] initWithFrame:方法labelFrame] - >保留計數爲1
self.label = tempLabel - >擋計數現在是2
但是,你只能使用自我。標籤,所以如果你不使用autorelease或發佈你創建的標籤,你會得到內存泄漏問題;)
這些都差不多。在第二個片段中,如果setLabel:做了一個副本呢?現在你已經從'[[UILabel alloc] initWithFrame:labelFrame]'泄露了標籤,然後在你的實例變量中過度發佈了標籤。一定要小心準確地發佈你想要發佈的內容! – jfortmann
如果屬性是'retain'或'copy',你是否需要在'dealloc'中再次釋放標籤?在執行代碼後,使用第二行會給它一個保留計數1 - 一個用於alloc,一個來自屬性調用,一個來自發行版。 – jmosesman
如果您的財產之前沒有「保留」或「複製」,那麼第一個變體將被過度發佈。但是,是的,如果你的財產被標記爲「retain」或「copy」,那麼如果你不使用ARC,你必須在dealloc中釋放它。 爲了得到第二個模式,你會做 'UILabel * someLabel = [[UILabel alloc] initWithFrame:labelFrame]; self.label = someLabel; [somelabel release];' – jfortmann