Casi estoy entendiendo la gestión simple de conteo/memoria de referencia en Objective-C, sin embargo, estoy teniendo dificultades con el siguiente código. Estoy lanzando mutableDict (comentado en el código a continuación) y está causando un comportamiento perjudicial en mi código. Si dejo escapar la memoria, funciona como se esperaba, pero esa no es la respuesta aquí. ;-) ¿Alguno de ustedes, gente más experimentada, sería tan amable de señalarme en la dirección correcta, ya que puedo volver a escribir cualquiera de estos métodos para manejar mejor la huella de mi memoria? Principalmente con la forma en que estoy manejando NSMutableDictionary * mutableDict, ya que ese es el gran culpable aquí. Me gustaría entender el problema, y no solo copiar/pegar código, por lo que algunos comentarios/comentarios son ideales. Gracias a todos.Objective-C: Corregir la gestión de memoria en un método
- (NSArray *)createArrayWithDictionaries:(NSString *)xmlDocument
withXPath:(NSString *)XPathStr {
NSError *theError = nil;
NSMutableArray *mutableArray = [[[NSMutableArray alloc] init] autorelease];
//NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
CXMLDocument *theXMLDocument = [[[CXMLDocument alloc] initWithXMLString:xmlDocument options:0 error:&theError] retain];
NSArray *nodes = [theXMLDocument nodesForXPath:XPathStr error:&theError];
int i, j, cnt = [nodes count];
for(i=0; i < cnt; i++) {
CXMLElement *xmlElement = [nodes objectAtIndex:i];
if(nil != xmlElement) {
NSArray *attributes = [NSArray array];
attributes = [xmlElement attributes];
int attrCnt = [attributes count];
NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
for(j = 0; j < attrCnt; j++) {
if([[[attributes objectAtIndex:j] name] isKindOfClass:[NSString class]])
[mutableDict setValue:[[attributes objectAtIndex:j] stringValue] forKey:[[attributes objectAtIndex:j] name]];
else
continue;
}
if(nil != mutableDict) {
[mutableArray addObject:mutableDict];
}
[mutableDict release]; // This is causing bad things to happen.
}
}
return (NSArray *)mutableArray;
}
Alex, ahora estoy revisando el código, pero un problema que veo enseguida es que los atributos estarán fuera de alcance antes de que puedas devolverlos. –
Creo que acaba de hacer un error tipográfico (y no tengo suficiente representante para editarlo) - Creo que la última línea debería ser "devolver diccionarios". La instancia attributeDictionary se agrega a esta matriz, por lo que no saldrá del alcance. – erikprice
Sí. Erik tiene razón No lo entendí lo suficientemente pronto. – Alex