Вопрос

Итак, в моем контроллере просмотра я запускаю код для заполнения NSArray объектов Customer (пользовательский класс).Этот пользовательский класс содержит объекты ДРУГОГО пользовательского класса, называемые Address (у клиента есть адрес выставления счетов и адрес доставки).В контроллере представления, когда выбирается клиент из списка, он передает новому контроллеру представления объект customer, например:

- (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];
}

В первый раз, когда я посещаю этот контроллер представления во время запуска приложения, он работает нормально.Однако, когда я повторно захожу в view controller, происходит кое-что интересное.Приложение завершает работу с нераспознанным селектором, отправленным экземпляру 0x00whatever.Используя функцию отладки наведения курсора мыши в xCode, я обнаружил, что тип первого объекта переменной ShipAddress клиента изменен с NSString на NSIndexPath.Этого не происходит с объектом BillAddress клиента.У кого-нибудь есть какие-нибудь идеи, что здесь происходит?Похоже, у меня могут возникнуть проблемы с управлением памятью, но я определенно хотел бы получить подтверждение по этому поводу, прежде чем я разорву свой код на части, отслеживая все сохранения и выпуски....

Редактировать:Более подробная информация здесь.с помощью следующего кода у меня есть NSMutableArray на уровне класса.На каждой итерации цикла я перебираю узлы в XML (что работает нормально).Каждый раз, когда в качестве первой буквы имени обнаруживается новая буква, я создаю новый подмассив и добавляю в него клиента, таким образом заполняя мой NSMutableArray уровня класса (customers) подмассивами клиентов для каждой обнаруженной буквы алфавита.Мой вопрос касается сохранения и освобождения объекта cycling customer .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];
...
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top