2009-07-14 3 views
0

Итак, на мой взгляд, контроллер, я запускаю код для заполнения объектов NSArray Customer (пользовательский класс). Этот пользовательский класс имеет объекты, принадлежащие произвольному классу ANOTHER, называемому 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 клиента. Кто-нибудь знает, что здесь происходит? Кажется, что у меня могут быть проблемы с управлением памятью, но я бы определенно хотел подтвердить это, прежде чем я разорву свой код, оставив все остатки и релизы ....

EDIT: Более подробную информацию здесь. со следующим кодом, у меня есть 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 ему не нравится.

EDIT: Адреса в классе Customer назначаются таким образом (который сейчас не работает после того, как лязг исправлений)

... 
else if ([tempname isEqualToString:@"BillAddress"]) 
    billAddress = [billAddress initWithAddressNode:tempnode]; 
else if ([tempname isEqualToString:@"ShipAddress"]) 
    shipAddress = [shipAddress initWithAddressNode:tempnode]; 
... 
+0

Я отредактировал это, но я не знаю, отображается ли оно как обновление ... – jmeado3

+0

Вы используете много выделов с сохранением на них, обычно это не очень хорошая практика, вы увеличиваете количество ссылок на 2 сюда. Здесь есть потенциальная проблема с дополнительным массивом (возможно). Что не нравится? И что не работает в коде? Когда вызывается этот код? – Daniel

+0

Этот код вызывается при успехе NSURLConnection (получение данных). Оба моих класса возвращают [self autorelease] после их инициализации. Я думал, что это хорошая практика. Я удалил сохраненные строки в строке alloc + keep, и теперь я получаю недопустимые объекты раньше, чем раньше. В моем классе Customer есть две переменные адреса (другой пользовательский класс). оба этих свойства установлены на неатомические, сохраняются и синтезируются. Класс адресов ALSO возвращает [self autorelease]. Код для инициализации адреса теперь размещен выше. – jmeado3

ответ

1

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

Смежные вопросы