Я почти там разбираюсь в простом подсчете ссылок / управлении памятью в Objective-C, однако у меня возникают трудности со следующим кодом. Я выпускаю mutableDict (прокомментировано в коде ниже), и это вызывает вредное поведение в моем коде. Если я позволю утечке памяти, она будет работать, как и ожидалось, но это явно не ответ здесь. ;-) Может быть, кто-нибудь из вас, более опытных, будет достаточно любезен, чтобы указать мне правильное направление, например, как я могу переписать любой из этих методов, чтобы лучше справляться с моей памятью? Главным образом с тем, как я управляю NSMutableDictionary * mutableDict, так как это большой виновник здесь. Я хотел бы понять проблему, а не просто скопировать / вставить код - поэтому некоторые комментарии / отзывы идеальны. Спасибо всем.
- (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;
}