2009-08-11 95 views
1
UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier] autorelease]; 
... 
return cell; 

這個代碼是否會在使用它之前自動釋放單元格?據我所知,單元本身沒有保留,當ell返回時,autorelease可能會啓動,不是嗎?iphone表格單元格保留/發佈

它似乎可以工作,我只想完全理解它爲什麼。

回答

2

直到NSAutoreleasePool排空,自動釋放不會「踢入」,這在方法返回時不會完成。除非手動創建NSAutoreleasePool,否則在事件循環期間池會被耗盡。只要您在返回到事件循環之前將表格單元格添加到UITableView(保留它),單元格就會停留。

-1

它是值得你更多地處理iPhone內存管理。

基本上,[alloc]和[copy]都會使您的保留數增加1。所以下列行:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier] autorelease]; 

遞增您的新單元格對象,從零到一個保留計數。

可以然後手動降低保留計數回零,當你用它做,通過鍵入以下內容:自動釋放的

[cell release]; 

,而不是。這會將其保留計數減少到零,此時iPhone系統會自動爲該對象釋放內存。 [請注意,您永遠不會調用[電池的dealloc]直接 - 相反,當保留計數回零的dealloc自動發生。]

但是,你不容易知道什麼時候會不再需要該單元格。所以你可以使用[autorelease]。

沒有深入瞭解autorelease的工作原理,它有效地收集了所有不再被引用的對象,並在下一個運行週期開始時釋放它們(並因此釋放它們)。

只要你有一個單元對象的引用,它就不會被自動釋放。當你沒有引用它時,它會被添加到autorelease池中,並在適當的時候被釋放。

對不起,這有點涉及 - 這是否有幫助??!

+0

不正確!自動釋放意味着稍後將其計數歸零......自己調用[單元格釋放]將在稍後導致崩潰。 – 2009-08-11 22:57:03

+0

雅我也已經知道了。我明白引用計數jsut不確定UITableViewCell的工作方式。我已經釋放了對象,然後才能將它們保留在調用代碼中,儘管這可能是由gdb引起的。 – Brenden 2009-08-11 23:21:50

+0

Kendall你太急躁了...我的整個文本說,雖然你*可以*手動發佈它,你已經改爲(正確)將其設置爲autorelease。很明顯,如果你真的調用[cell release]也使用[autorelease],它會崩潰! *嘆息*希望人們會在downvoting之前閱讀... – h4xxr 2009-08-11 23:37:11

1

當您返回一個單元格時,您遵循的標準慣例是由方法創建的對象是自動釋放的,並且如果某件事關心它需要保留的對象。

在這種情況下,那個「something」是UITableView詢問你的單元格。當這個方法返回單元格時,調用你的代碼會保留它並保留它,直到表視圖被釋放。

那麼爲什麼autorelease在返回之前不會釋放它?因爲在Objective-C中發生的所有事情都在所謂的「RunLoop」中,這意味着 - 它是一個一次又一次運行的循環。在表視圖完成調用之後,它返回,然後告訴表視圖更新返回,等等,直到達到頂層runloop - 此時執行autoreleases並且單元格保持計數下降1。但是,再次好,因爲UITableView保留了它。