Цель C Добавление пользовательских объектов в NSMutableArray - PullRequest
0 голосов
/ 14 марта 2012

Я хочу сохранить список записей данных в 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

В viewDidLoad моего UITableViewController я создаю экземпляр массива:

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, поэтому было бы здорово, если бы кто-нибудь смог подтвердить все, что я до сих пор делал, имеет смысл и в порядке. Я получаю периодическую ошибку EXC_BAD_ACCESS при попытке прочитать свойство acCompany (см. Комментарий рядом со строкой), поэтому что-то должно быть не так.

Любая помощь приветствуется,

Jonathan

1 Ответ

0 голосов
/ 14 марта 2012

Весь ваш код кажется мне разумным и правильным на первый взгляд.

Несколько вещей, на которые я бы посмотрел:

  1. Убедитесь, что ячейка определенносвойство lblCompanyName.Если вы пытаетесь присвоить свойству, которое не существует, вы получите этот тип ошибки.Вы определили пользовательский тип объекта ячейки?

  2. Убедитесь, что это всегда свойство acCompany, вызывающее EXC_BAD_ACCESS, а не просто какое-либо свойство объекта.Один из способов сделать это - изменить порядок строк в методе cellForRowAtIndexPath.

  3. Убедитесь, что список listDataRecord, вызывающий сбой, заполняется правильно.Другими словами, подтвердите, что ваш jsonCustSuppRecord всегда действителен.Что возвращает jsonCustSuppRecord getStringForKey:, если ключ не существует в jsonCustSuppRecord?

  4. Установите точку останова в этой строке: [tableListDataArray addObject:custSuppItem]; и проверьте содержимое custSuppItemкаждый раз (это продолжение пункта 3. выше)

...