Question

Donc, dans mon contrôleur de vue, je lance le code pour remplir un NSArray de Objets Client (classe personnalisée). Cette classe personnalisée a des objets qui sont d'une autre classe personnalisée appelée adresse (un client a une adresse de facturation et une adresse de livraison). Dans le contrôleur de vue quand un client dans la liste est sélectionné, il passe un nouveau contrôleur de vue d'un objet client, comme suit:

- (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 première fois que je visite ce contrôleur de vue lors de l'exécution de l'application, il fonctionne très bien. Cependant, quand je revisite le contrôleur de vue, quelque chose d'intéressant se produit. L'application se bloque, avec sélecteur non reconnu envoyé à l'instance 0x00whatever. Utilisation de la fonction de mise au point de passage de la souris dans Xcode, je trouve que la première de la variable objet de shipAddress du client a changé son type de NSString à NSIndexPath. Cela ne se produit pas à l'objet billAddress du client. Quelqu'un at-il une idée de ce qui se passe ici? Il semble que je sois avoir des problèmes de gestion de la mémoire, mais je vraiment comme une confirmation avant que je déchire mon code de suivi à part vers le bas toutes les versions et conserve ....

EDIT: Plus d'informations ici. avec le code suivant, j'ai un NSMutableArray au niveau de la classe. A chaque itération de la boucle, je suis une boucle à travers les nœuds XML (qui fonctionne très bien). Chaque fois qu'une nouvelle lettre est détectée comme la première lettre du nom, je crée une nouvelle sous-tableau et ajouter le client à lui, comblant ainsi ma classe de niveau NSMutableArray (clients) avec des clients pour des sous-réseaux chaque lettre de l'alphabet détecté. Ma question concerne la conserve et libère de l'objet client cycliste. Clang statique dit qu'il ya une erreur sur de rétention sur le client, mais quand je le fixe selon Clang, les accidents de la boucle. ce qui donne? Code connexes ci-dessous:

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

NOTE: ce code fonctionne pour la plupart, mais clang ne l'aime pas

.

EDIT: Adresses dans la classe client sont attribués comme si (ce qui ne fonctionne plus après corrections Clang)

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
Était-ce utile?

La solution

On dirait que vous avez un problème de libération de plus, donc oui gestion de la mémoire, vous pourriez être overreleasing ce tableau vous stockez vos objets in.Cant vraiment dire de l'extrait de code bien. Vous aurez à aller chercher le code et trouver la source. Aussi utilise Clang analyseur statique pourrait être utile pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top