如何解决uitableview中对象的释放问题?

时间:2010-04-20 04:50:13

标签: iphone objective-c cocoa-touch uitableview

我有一个高大的细胞的桌子视图。高约300。单元格是自定义的并具有关联的笔尖。在cellForRowAtIndexPath中,我使用indexPath.row访问数组中的对象。该对象具有属性,我将其分配给自定义单元格上的标签。这适用于前两个单元格。一旦我滚动足够第三个单元格被创建,应用程序崩溃。

我有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;
}

2 个答案:

答案 0 :(得分:2)

以下是解决方案:

如OP中所述,这是一个自定义单元格并加载一个笔尖。我正在使用

static NSString *CellIdentifier = @"Cell";

但没有在IB中为标识符指定任何内容。这是空白的。在为标识符输入“Cell”之后,它现在可以正常工作。我猜测nib正在从代码中创建的单元格对象中释放出来,因为一个有标识符而另一个没有。

我会对IB标识符在这种情况下对单元格如此重要的细节感兴趣...如果有人能够提供一些细节。

答案 1 :(得分:1)

您需要阅读loadNibNamed:owner:options:的文档。你的问题的答案就在那里:

  

您应该手动保留返回的数组或其包含的对象,以防止nib文件对象过早释放。

我会为load方法返回的数组创建一个实例变量和属性,并确保该数组被保留,否则当自动释放池为当前事件时,它及其中的所有对象都将消失。倒掉。