Pregunta

Entonces, en mi controlador de vista, ejecuto código para completar un NSArray de objetos Cliente (clase personalizada).Esta clase personalizada tiene objetos que son de OTRA clase personalizada llamada Dirección (un cliente tiene una dirección de facturación y una dirección de envío).En el controlador de vista, cuando se selecciona un cliente en la lista, le pasa a un nuevo controlador de vista un objeto de cliente, así:

- (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 primera vez que visito este controlador de vista mientras ejecuto la aplicación, funciona bien.Sin embargo, cuando vuelvo a visitar el controlador de vista, sucede algo interesante.La aplicación falla y el selector no reconocido se envía a la instancia 0x00lo que sea.Al utilizar la función de depuración al pasar el mouse en xCode, encuentro que el primer objeto de la variable shipAddress del cliente tiene su tipo cambiado de NSString a NSIndexPath.Esto no sucede con el objeto billAddress del cliente.¿Alguien tiene alguna idea de lo que está pasando aquí?Parece que puedo estar teniendo problemas con la administración de la memoria, pero definitivamente me gustaría recibir una confirmación antes de romper mi código rastreando todas las retenciones y liberaciones...

EDITAR:Más información aquí.con el siguiente código, tengo un NSMutableArray a nivel de clase.En cada iteración del bucle, recorro nodos en XML (que funciona bien).Cada vez que se detecta una nueva letra como la primera letra del nombre, creo un nuevo subarreglo y le agrego el cliente, llenando así mi NSMutableArray (clientes) de nivel de clase con subarreglos de clientes para cada letra del alfabeto detectada.Mi pregunta es sobre las retenciones y liberaciones del objeto de cliente ciclista.Clang Static dice que hay un error de retención excesiva en el cliente, pero cuando lo soluciono según Clang, el bucle falla.¿lo que da?Código relacionado a continuación:

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 en su mayor parte, pero a clang no le gusta.

EDITAR:Las direcciones en la clase Cliente se asignan así (lo que ahora no funciona después de que Clang corrija)

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

Solución

Parece que usted está teniendo un problema de liberación a lo largo, de modo que sí la gestión de memoria, que podría ser overreleasing esa matriz que está almacenando sus objetos in.Cant realmente decir desde el fragmento de código sin embargo. Vas a tener que ir a buscar a través del código y encontrar la fuente. También usando Clang analizador estático podría ser de ayuda para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top