Итак, на мой взгляд, контроллер, я запускаю код для заполнения объектов 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];
...
Я отредактировал это, но я не знаю, отображается ли оно как обновление ... – jmeado3
Вы используете много выделов с сохранением на них, обычно это не очень хорошая практика, вы увеличиваете количество ссылок на 2 сюда. Здесь есть потенциальная проблема с дополнительным массивом (возможно). Что не нравится? И что не работает в коде? Когда вызывается этот код? – Daniel
Этот код вызывается при успехе NSURLConnection (получение данных). Оба моих класса возвращают [self autorelease] после их инициализации. Я думал, что это хорошая практика. Я удалил сохраненные строки в строке alloc + keep, и теперь я получаю недопустимые объекты раньше, чем раньше. В моем классе Customer есть две переменные адреса (другой пользовательский класс). оба этих свойства установлены на неатомические, сохраняются и синтезируются. Класс адресов ALSO возвращает [self autorelease]. Код для инициализации адреса теперь размещен выше. – jmeado3