Pergunta

Então, no meu controlador de vista, eu executar o código para preencher um NSArray de cliente (classe personalizada) objetos. Esta classe personalizado tem objetos que são de outra classe personalizada chamada de endereços (um cliente tem um endereço de cobrança e endereço de entrega). No controlador de vista quando um cliente na lista é selecionado, ele passa uma nova visão controlador de um objeto cliente, assim:

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

A primeira vez que eu visitar este controlador de vista durante a execução do aplicativo, ele funciona bem. No entanto, quando eu revisitar o controlador de vista, algo interessante acontece. O aplicativo trava, com selector não reconhecido enviada à instância 0x00whatever. Usando o recurso mouseover depuração no Xcode, eu estou achando que o primeiro objeto de variável shipAddress do cliente tem seu tipo alterado de NSString para NSIndexPath. Isso não acontece com objeto billAddress do cliente. Alguém tem alguma idéia do que está acontecendo aqui? Parece que eu pode estar tendo problemas de gerenciamento de memória, mas eu definitivamente como uma confirmação sobre isso antes de eu rasgo meu código para além rastrear todo o retém e liberta ....

EDIT: Mais informações aqui. com o seguinte código, eu tenho uma NSMutableArray no nível da classe. Em cada iteração do loop, estou looping através de nós em XML (que funciona bem). Cada vez que uma nova carta é detectado como a primeira letra do nome, eu criar uma nova subarray e adicionar o cliente para ele, preenchendo assim a minha classe de nível NSMutableArray (clientes) com subarrays de clientes para cada letra do alfabeto detectado. Minha pergunta é sobre o mantém e lançamentos do objeto cliente ciclismo. Clang estática diz que há um erro excesso de retenção no cliente, mas quando eu corrigi-lo de acordo com Clang, o loop falha. o que da? código relacionado abaixo:

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

NOTA:. Este código funciona para a maior parte, mas clang não gosta

EDIT: Endereços na classe Cliente são atribuídas assim (que agora não funciona após correções Clang)

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
Foi útil?

Solução

Parece que você está tendo um problema de liberação acabou, então sim gerenciamento de memória, você pode ser overreleasing essa matriz está a armazenar seus objetos in.Cant realmente dizer do trecho de código embora. Você tem que ir e olhar através do código e encontrar a fonte. Também usando Clang estática Analyzer pode ser de ajuda para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top