Утечка памяти при использовании NSDictionary из NSDictionaries - PullRequest
0 голосов
/ 17 января 2011

Я пытаюсь разобрать XML. У меня в основном есть NSMutableDictionary (скажем, root), элементами которого являются другие словари (например, branch_1, branch_2, branch_3 и т. Д.).

При анализе XML для каждой ветви я создаю NSMutableDictionary и добавляю в него элементы следующим образом:

if ([elementName compare:@"branch_1"] == NSOrderedSame) 
{
    [root setObject:[[NSMutableDictionary alloc] init] forKey:@"branch_1"]; //Creating a new NSMutableDictionary            
} 

//Adding elements to the newly created NSMutabeDictionary 

if ([elementName compare:@"element_1"] == NSOrderedSame) 
{
   [[root objectForKey:@"branch_1"] setObject:someObject forKey:@"element_1"];                                      
} 

if ([elementName compare:@"element_2"] == NSOrderedSame) 
{
   [[root objectForKey:@"branch_1"] setObject:someObject forKey:@"element_2"];                                      
}

Затем я наконец освобождаю свой корневой словарь в методе dealloc. Однако инструмент анализа в Xcode показывает утечку в строке, где я создал новые словари для branch_1 и т. Д.

Полагаю, мне следует выпустить словари веток перед тем, как выпустить корневой словарь. Однако не следует ли освобождать содержимое корневого словаря при освобождении самого корня?

Пожалуйста, дайте мне знать, как я могу исправить эту утечку. Любая помощь будет оценена !!

1 Ответ

4 голосов
/ 17 января 2011

Проблема в том, что вы не публикуете ссылки на вновь созданный словарь.В

[root setObject:[[NSMutableDictionary alloc] init] forKey:@"branch_1"];

вы создаете новый словарь с помощью

[[NSMutableDictionary alloc] init]

Ваш корневой словарь получит retain это значение.Первоначальная ссылка , за которую вы несете ответственность , поскольку вы использовали alloc для ее получения, просочилась сюда.Итак, попробуйте

[[[NSMutableDictionary alloc] init] autorelease]

.

Редактировать Другим способом достижения желаемого поведения будет использование одного из методов конструктора удобства, определенных классом NSMutableDictionary:

[NSMutableDictionary dictionary]

Объектсохраняется до тех пор, пока кто-то имеет (правильно retain ed) ссылку на него.В этом случае ваш корневой словарь будет содержать только что созданный дочерний словарь (setObject:forKey: отправляет значения retain значениям).

...