我有一个高大的细胞的桌子视图。高约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;
}
答案 0 :(得分:2)
以下是解决方案:
如OP中所述,这是一个自定义单元格并加载一个笔尖。我正在使用
static NSString *CellIdentifier = @"Cell";
但没有在IB中为标识符指定任何内容。这是空白的。在为标识符输入“Cell”之后,它现在可以正常工作。我猜测nib正在从代码中创建的单元格对象中释放出来,因为一个有标识符而另一个没有。
我会对IB标识符在这种情况下对单元格如此重要的细节感兴趣...如果有人能够提供一些细节。
答案 1 :(得分:1)
您需要阅读loadNibNamed:owner:options:的文档。你的问题的答案就在那里:
您应该手动保留返回的数组或其包含的对象,以防止nib文件对象过早释放。
我会为load方法返回的数组创建一个实例变量和属性,并确保该数组被保留,否则当自动释放池为当前事件时,它及其中的所有对象都将消失。倒掉。