2010-07-31 76 views
2
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId]; 
if (cell == nil) 
    { 
    [[NSBundle mainBundle] loadNibNamed:@"ThemeCell" owner:self options:nil]; 
     cell = self.themeCell; 
     self.themeCell = nil; 
} 
... 
return cell; 

我的理解是,self.themeCell = nil;應該銷燬該對象,因爲它不再擁有它。 cell = self.themeCell不保留它,但只是分配它。那麼細胞活着是什麼?我只能假設綜合屬性是自動釋放舊值而不是立即釋放它。是這樣嗎?爲什麼這個NIB視圖在返回之前沒有被釋放?

回答

2

筆尖加載過程稍微(但不是很複雜),並且在OSX和iPhone平臺之間有所不同。你可以在資源編程指南的the Nib Object Life Cycle部分閱讀。在表1-1中,你會發現這樣的:在筆尖文件

對象創建 爲1的保留計數,然後 自動釋放。因爲它重建 對象分層結構,但是,UIKit的 重新建立使用的setValue的 對象之間的連接:forKey: 方法,該方法通過 默認使用可用 setter方法或保留了對象,如果沒有setter方法是 可用

所以會發生的是,單元格創建時的保留計數爲1,然後當它與您的合成設置器一起設置時,它會增加到2.當您將屬性設置爲nil時,保留計數會降低到1,並且該單元格返回到表格視圖。表視圖將其添加到其視圖層次結構中,從而保留它(也可以將其保留在其邏輯的其他部分中)。畢竟,autorelease池被排空。

我只能假設,syntesized 屬性被自動釋放舊 值,而不是釋放,這是 情況?

不,合成設置者立即釋放對象。 (儘管一些框架類可能會持續更長時間的對象,如果它是一個需要動畫的視圖)。

0

AFAIK,綜合性能使用release,而不是autorelease

它可能是該單元格有一個委託或在保留所有權的NIB中指定的代理或loadNibNamed:owner:options:調用中的某些內容在仍處於待定狀態的對象上設置autorelease。在self.themeCell=nil;之前和之後加上NSLog(@"Retain Count: %d", [cell retainCount]);進行驗證。

相關問題