Тип переменной класса изменяется - PullRequest
0 голосов
/ 14 июля 2009

Таким образом, в моем контроллере представления я запускаю код для заполнения 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];
...

1 Ответ

1 голос
/ 14 июля 2009

Звучит так, как будто у вас проблема с перепуском релиза, так что да, управление памятью, вы можете перевыпускать тот массив, в котором храните ваши объекты. Хотя, на самом деле, вы можете сказать это из фрагмента кода. Вы должны пойти и просмотреть код и найти источник. Также может помочь использование Clang Static Analyzer.

...