目标C将自定义对象添加到NSMutableArray中

时间:2012-03-14 10:23:29

标签: objective-c object nsmutablearray exc-bad-access

我想在NSMutableArray中存储数据记录列表,以便在UITableView中使用。在其他语言中,我会使用一个简单的“类型”结构来定义记录结构,但我知道在Obj-C中执行此操作的方法是定义一个新类。我这样做了如下:

@interface CustSuppListItem : NSObject
@property (nonatomic, copy, readwrite) NSString *acCode;
@property (nonatomic, copy, readwrite) NSString *acCompany;
@property (nonatomic, copy, readwrite) NSString *acContact;
@property (nonatomic, assign, readwrite) double osBalBase;
@property (nonatomic, assign, readwrite) unsigned int acAccStatus;
@end

@implementation CustSuppListItem
@synthesize acCode, acCompany, acContact, osBalBase, acAccStatus;
@end

在我的UITableViewController的viewDidLoad中,我实例化了数组:

tableListDataArray = [[NSMutableArray alloc] init];

检索完数据后,我将其添加到数组中,如下所示:

CustSuppListItem *custSuppItem = [[CustSuppListItem alloc] init];
[custSuppItem setAcCode:[jsonCustSuppRecord getStringForKey:@"acCode"]];
[custSuppItem setAcCompany:[jsonCustSuppRecord getStringForKey:@"acCompany"]];
[custSuppItem setAcContact:[jsonCustSuppRecord getStringForKey:@"acContact"]];
[custSuppItem setOsBalBase:[jsonCustSuppRecord getDoubleForKey:@"osBalBase"]];
[custSuppItem setAcAccStatus:[jsonCustSuppRecord getIntForKey:@"acAccStatus"]];                             
[tableListDataArray addObject:custSuppItem];                          
[custSuppItem release];

在我的表cellForRowAtIndexPath方法中,我检索当前单元格的数据,如下所示:

CustSuppListItem *listDataRecord = [tableListDataArray objectAtIndex:indexPath.row];
[cell.lblCompanyName setText:listDataRecord.acCompany];  // EXC_BAD_ACCESS here
[cell.lblAcCodeContact setText:[NSString stringWithFormat:@"%@, %@",
                                listDataRecord.acCode, listDataRecord.acContact]];
[cell.lblBalance setText:[Utils fmtNumber:listDataRecord.osBalBase withDecPlaces:2]];
[cell.lblStatus setText:[Utils exchAccStatusDesc:listDataRecord.acAccStatus]];
return cell;

在视图控制器的dealloc方法中,我发布了NSMutableArray:

[tableListDataArray release];

我对Obj-C很新,所以如果有人能够确认到目前为止我所做的一切都是有道理的,那就太棒了。我在尝试读取acCompany属性时遇到间歇性的EXC_BAD_ACCESS错误(请参阅行旁边的注释),所以一定不能正确。

任何帮助表示赞赏,

乔纳森

1 个答案:

答案 0 :(得分:0)

乍一看,您的所有代码看起来都合理且正确。

我要看的一些事情是:

  1. 确认该单元格肯定具有属性lblCompanyName。如果您尝试分配给不存在的属性,那么您将收到此类错误。您是否定义了自定义单元格对象类型?

  2. 确认它始终是导致acCompany的{​​{1}}属性,而不仅仅是对象上的任何属性。一种方法是更改​​EXC_BAD_ACCESS方法中行的顺序。

  3. 确认首先正确填充导致崩溃的listDataRecord。换句话说,请确认您的cellForRowAtIndexPath始终有效。如果jsonCustSuppRecord中不存在密钥,jsonCustSuppRecord getStringForKey:会返回什么?

  4. 在此行设置断点:jsonCustSuppRecord并每次检查[tableListDataArray addObject:custSuppItem];的内容(这是上面第3点的扩展)