Już prawie rozumiem proste liczenie odwołań/zarządzanie pamięcią w Objective-C, jednak mam trudny czas z następującym kodem. Zwolniłem mutableDict (skomentowałem w poniższym kodzie) i powoduje to szkodliwe zachowanie w moim kodzie. Jeśli pozwolę, aby pamięć przeciekała, działa zgodnie z oczekiwaniami, ale to oczywiście nie jest odpowiedź tutaj. ;-) Czy ktokolwiek z was bardziej doświadczonych ludzi byłby na tyle uprzejmy, by wskazać mi właściwy kierunek, w jaki sposób mogę ponownie napisać którąś z tych metod, aby lepiej radzić sobie z moim śladem pamięci? Głównie z tym, jak zarządzam NSMutableDictionary * mutableDict, ponieważ jest to wielki winowajca. Chciałbym zrozumieć problem, a nie tylko skopiować/wkleić kod - więc niektóre komentarze/opinie są idealne. Dziękuje wszystkim.Objective-C: Naprawianie zarządzania pamięcią w metodzie
- (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, teraz sprawdzam kod, ale od razu widzę problem polegający na tym, że funkcja attributeDictionaries wyjdzie poza zakres, zanim będzie można go zwrócić. –
Myślę, że właśnie zrobił literówkę (i nie mam wystarczającej liczby przedstawicieli, aby ją edytować) - myślę, że ostatnia linia powinna być "słowniki zwrotne". Instancja attributeDictionary jest dodawana do tej tablicy, więc nie wykracza poza zakres. – erikprice
Yup. Erik ma rację. Nie zauważyłem tego wystarczająco szybko. – Alex