Таким образом, в моем контроллере представления я запускаю код для заполнения NSArray объектов Customer (пользовательский класс). Этот пользовательский класс имеет объекты ДРУГОГО пользовательского класса с именем Address (у клиента есть адрес для выставления счета и адрес для доставки). В контроллере представления, когда клиент в списке выбран, он передает новому контроллеру представления объект клиента, например так:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
InfoViewController *customerinfoViewController = [[InfoViewController alloc] initWithStyle:UITableViewStyleGrouped andCustomer:[[[customers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] retain]];
[self.navigationController pushViewController:customerinfoViewController animated:YES];
[customerinfoViewController release];
}
Когда я в первый раз посещаю этот контроллер вида во время работы приложения, он работает нормально. Однако, когда я снова посещаю контроллер представления, происходит нечто интересное. Приложение аварийно завершает работу, и нераспознанный селектор отправляется экземпляру 0x00, что угодно. Используя функцию отладки при наведении курсора мыши в xCode, я обнаружил, что первый объект переменной shipAddress клиента изменил свой тип с NSString на NSIndexPath. Это не происходит с объектом billAddress клиента. Кто-нибудь знает, что здесь происходит? Кажется, у меня могут быть проблемы с управлением памятью, но я бы определенно хотел получить подтверждение по этому поводу, прежде чем разорвать свой код на части, отслеживая все сохранения и выпуски ....
РЕДАКТИРОВАТЬ: Больше информации здесь. с помощью следующего кода у меня есть NSMutableArray на уровне класса. На каждой итерации цикла я перебираю узлы в XML (что прекрасно работает). Каждый раз, когда новая буква обнаруживается в качестве первой буквы имени, я создаю новый подмассив и добавляю в него клиента, таким образом заполняя свой NSMutableArray (клиенты) на уровне класса подмассивами клиентов для каждой обнаруженной буквы алфавита. Мой вопрос о сохранении и выпуске объекта клиента. Clang Static говорит, что у клиента слишком большая ошибка, но когда я исправляю ее в соответствии с Clang, цикл прерывается. что дает? Связанный код ниже:
DDXMLDocument *rootDoc = [[[DDXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
NSArray *elems = [rootDoc nodesForXPath:@"QBXML/QBXMLMsgsRs/CustomerQueryRs/CustomerRet" error:nil];
DDXMLNode *node;
sectionTitles = [[[NSMutableArray alloc] initWithCapacity:1] retain]; // Letters for UITableView section titles
NSMutableArray *subArray;
NSString *lastchar = @"A";
NSString *testchar;
int indexCount = -1;
customers = [[[NSMutableArray alloc] initWithCapacity:[elems count]] retain];
Customer *newCust;
for (int i = 0; i < [elems count]; i++) {
node = [elems objectAtIndex:i];
newCust = [[Customer alloc] initWithCustomerRetNode:node];
testchar = [[newCust fullName] substringToIndex:1];
if (i == 0 || ![[testchar uppercaseString] isEqualToString:lastchar]) {
[sectionTitles addObject:testchar];
lastchar = testchar;
indexCount++;
subArray = [[NSMutableArray alloc] initWithCapacity:1];
[customers addObject:subArray];
[subArray release];
[[customers lastObject] addObject:[newCust retain]];
}
else {
[[customers lastObject] addObject:[newCust retain]];
}
[newCust release];
}
ПРИМЕЧАНИЕ: этот код работает по большей части, но Clang это не нравится.
РЕДАКТИРОВАТЬ: Адреса в классе Customer назначаются так (что теперь не работает после исправлений Clang)
...
else if ([tempname isEqualToString:@"BillAddress"])
billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
shipAddress = [shipAddress initWithAddressNode:tempnode];
...