Sunt aproape simplă înțelegere de management de numărare de referință / de memorie în Objective-C, cu toate acestea am o perioadă dificilă, cu următorul cod. Sunt eliberarea mutableDict (a comentat în codul de mai jos) și cauzează un comportament dăunător în codul meu. Dacă am lăsat scurgere de memorie, funcționează cum era de așteptat, dar asta nu e clar răspunsul aici. ;-) Vrei oricare dintre voi oameni mai experimentați să fie un fel de ajuns pentru a-mi punct în direcția cea bună ca și cum pot re-scrie oricare dintre aceste metode pentru a gestiona mai bine amprenta de memorie? În principal, cu modul în care Gestionez NSMutableDictionary * mutableDict, ca este mare vinovat aici. Aș vrea să înțeleg problema, și nu doar copy / paste codul - astfel încât unele comentarii / feedback-ul este ideal. Multumesc tuturor.
- (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;
}













