2010-04-20 63 views
2

我有一個高單元格的表格視圖。身高約300。單元格是自定義的,並有一個關聯的筆尖。在cellForRowAtIndexPath中,我使用indexPath.row訪問數組中的對象。該對象具有屬性,我將其分配給自定義單元格上的標籤。這適用於前兩個單元格。一旦我滾動足夠的第三個單元格創建,該應用程序崩潰。如何解決uitableview中對象的釋放問題?

我已經NSZombieEnabled集,這裏是輸出:

2010-04-19 21:48:13.360 MyApp[54463:207] *** -[CALayer release]: message sent to deallocated instance 0xfc4e50 
(gdb) continue 
2010-04-19 21:48:18.382 MyApp[54463:207] *** NSInvocation: warning: object 0xfc4e50 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead 
2010-04-19 21:48:18.383 MyApp[54463:207] *** NSInvocation: warning: object 0xfc4e50 of class '_NSZombie_CALayer' does not implement doesNotRecognizeSelector: -- abort 
(gdb) continue 
Program received signal: 「EXC_BAD_ACCESS」. 
(gdb) 

我不知道什麼被釋放。我怎樣才能追溯到源?

- 編輯 -

添加的cellForRowAtIndexPath執行:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

OrderCell *cell = (OrderCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"OrderCellView" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

// Set up the cell... 
if(self.rows != nil){ 
    id obj = [self.rows objectAtIndex:indexPath.row]; 
    cell.orderId.text = [NSString stringWithFormat:@"%@",[obj objectForKey:@"OrderId"]]; 
    cell.orderName.text = [NSString stringWithFormat:@"%@",[obj objectForKey:@"OrderName"]]; 
} 

return cell; 
} 
+0

聞起來像是一個由出隊單元重新使用引發的問題 - 但對我而言,如果沒有看到更多的代碼,就無法提供幫助。 – Till 2010-04-20 05:11:22

+0

我已經添加了cellForRowAtIndexPath實現。這還有幫助嗎?謝謝。 – 4thSpace 2010-04-20 05:53:32

回答

2

這裏是解決方案:

如OP提到的,這是一個自定義單元格並加載筆尖。我正在使用

static NSString *CellIdentifier = @"Cell"; 

但是沒有在標識符的IB中指定任何東西。它是空白的。將標識符放入「單元格」後,現在可以正常工作。我猜測筆尖是從代碼中創建的單元對象中釋放的,因爲一個有一個標識符,另一個沒有。

我對IB標識符爲什麼在這種情況下對於單元格如此重要的細節感興趣...如果任何人能夠提供一些細節。

1

您需要閱讀的loadNibNamed:owner:options:的文檔。您的問題的答案在那裏給出:

您應該保留返回的數組或手動包含的對象,以防止提前釋放nib文件對象。

我會爲load方法返回的數組創建一個實例變量和屬性,並確保數組被保留,否則它和它中的所有對象都將在當前事件結束時消失自動釋放池被排空。

+0

我創建了@property(nonatomic,retain)NSArray * CellViewNib;並在cellForRowAtIndexPath中使用self.CellViewNib。它沒有任何區別。 – 4thSpace 2010-04-20 14:38:52