Domanda

Quindi, a mio controller della vista, corro il codice per popolare un NSArray di clienti (classe personalizzata) oggetti. Questa classe personalizzata contiene oggetti che sono di un'altra classe personalizzata denominata Indirizzo (un cliente ha un indirizzo di fatturazione e un indirizzo di spedizione). Nel regolatore di visualizzazione quando è selezionato un cliente nell'elenco, passa un nuovo controller vista un oggetto cliente, in questo modo:

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

La prima volta che visito questo controller della vista durante l'esecuzione dell'applicazione, funziona benissimo. Tuttavia, quando ho rivisitare il controller della vista, succede qualcosa di interessante. L'applicazione si blocca, con selettore non riconosciuto rinviati esempio 0x00whatever. Utilizzando la funzione mouseover debug in Xcode, mi sto trovando che il primo oggetto della variabile shipAddress del cliente è il suo tipo cambiato da NSString a NSIndexPath. Questo non accade per oggetto billAddress del cliente. Qualcuno ha idea di cosa sta succedendo qui? Sembra che io sia avendo problemi di gestione della memoria, ma mi sarebbe sicuramente come una conferma su questo prima di strappare il mio codice a parte rintracciare tutte le conserva e rilascia ....

EDIT: Maggiori informazioni qui. con il seguente codice, ho un NSMutableArray a livello di classe. Ad ogni iterazione del ciclo, sto scorrendo i nodi XML (che funziona bene). Ogni volta che una nuova lettera è rilevato come la prima lettera del nome, creo una nuova sottoarray e aggiungi il cliente ad esso, colmando così la mia classe di livello NSMutableArray (clienti) con sottoarray di clienti per ogni lettera dell'alfabeto rilevato. La mia domanda riguarda la conserva e rilascia dell'oggetto ciclismo cliente. Clang statico dice che c'è un errore di over-mantenendo al cliente, ma quando posso risolvere il problema in base alle Clang, si blocca il ciclo. ciò che dà? Codice correlati qui sotto:

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: questo codice funziona per la maggior parte, ma clang non piace

.

EDIT: indirizzi della classe cliente vengono assegnati in questo modo (che ora non funziona dopo correzioni clang)

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
È stato utile?

Soluzione

Sembra che si stanno avendo un problema di rilascio sopra, quindi sì la gestione della memoria, si potrebbe essere overreleasing tale matrice si archiviano gli oggetti in.Cant veramente dire dal frammento di codice però. Dovrete andare a guardare attraverso il codice e trovare la fonte. Anche usando Clang Static Analyzer potrebbe essere di aiuto a voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top