iPhone: утечка памяти в пользовательском классе и NSMutableDictionary - PullRequest
2 голосов
/ 02 сентября 2010

Я провел пару дней, пытаясь выяснить, что происходит.Я прочитал множество документов по управлению памятью, и я до смерти устал от слуха «для каждого выделенного файла вам нужен релиз» - я знаю это и все еще не могу понять, почему мой код вызывает утечки памяти.

Я пишу простой пользовательский класс с NSMutableDictionary в качестве одного из его свойств.По сути, он имитирует XMLELement.Я не могу понять, почему выделение словаря вызывает утечку памяти.Утечка происходит как на устройстве, так и на симуляторе - 5 утечек на устройстве и 20 на симуляторе.

Утечка возникает, когда я объявляю и выделяю переменную * tmp.
Существует такжеутечка, когда я устанавливаю детали атрибута (имя и значение).

Это сводит меня с ума.Пожалуйста, помогите!

Часть кода:

</p> <pre><code>@interface IMXMLElement : NSObject { NSString *strElementName; NSString *strElementValue; NSMutableDictionary *dictAttributes; } @property (nonatomic, retain) NSString *strElementName; @property (nonatomic, retain) NSString *strElementValue; @property (nonatomic, retain) NSMutableDictionary *dictAttributes; @end @implementation IMXMLElement @synthesize strElementName; @synthesize strElementValue; @synthesize dictAttributes; -(id)initWithName:(NSString *)pstrName { self = [super init]; if (self != nil) { self.strElementName = pstrName; **LEAK NSMutableDictionary *tmp = [[NSMutableDictionary alloc] init]; self.dictAttributes = tmp; [tmp release]; } return self; } -(void)setAttributeWithName:(NSString *)pstrAttributeName andValue:(NSString *)pstrAttributeValue { **LEAK [self.dictAttributes setObject:pstrAttributeValue forKey:pstrAttributeName]; } -(void)dealloc { [strElementName release]; [strElementValue release]; [dictAttributes release]; [super dealloc]; }

Для доступа к этому классу используйте следующий код:

NSString *strValue = [[NSString alloc] initWithFormat:@"Test Value"];</p> <pre><code>IMXMLElement *xmlElement = [[IMXMLElement alloc] initWithName:@"Test_Element"]; [xmlElement setAttributeWithName:@"id" andValue:strValue];

Ответы [ 3 ]

0 голосов
/ 02 сентября 2010

Типичный синтаксис: NSMutableDictionary *tmp = [[[NSMutableDictionary alloc] init] autorelease];

0 голосов
/ 02 сентября 2010

Если у вас есть строки в качестве свойств, объявите их как копии, а не сохраняйте.

  NSMutableDictionary *tmp = [[NSMutableDictionary alloc] init];
  self.dictAttributes = tmp;
  [tmp release];

вышесказанное не нужно, вместо этого выполните: (сохранение объекта будет автоматически увеличено для этого объекта автоматического выпуска)

self.dictAttributes = [NSMutableDictionary dictionaryWithCapacity:0];

в dealloc: (сохранение количества будет автоматически уменьшено)

self.dictAttributes = nil;

обычно для свойств вы просто устанавливаете их равными nil вместо явного освобождения их поскольку get / setter справится с этим за вас.

0 голосов
/ 02 сентября 2010

Попробуйте [dictAttributes removeAllObjects] перед выпуском dictAttributes.

Edit:

Кроме того, у вас будет положительное распределение, потому что вы выделяете память для «tmp». Память будет сохранена, потому что теперь у вас есть ссылка из dictAttributes.

При добавлении элементов в словарь вы получаете более положительное распределение, которое также должно быть выделено и сохранено в памяти внутренними ссылками словаря.

...