Компилятор говорит, что есть утечка памяти, но я не вижу ее - PullRequest
2 голосов
/ 21 сентября 2011

Итак, я сделал это с XCode, где вы говорите, что проанализируйте, и он находит утечки и прочее, и здесь, он говорит, что я протекаю (отмечено в коде ниже).

// Copy dictionary to memory
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"DataCategoriesDictionary" ofType:@"plist"];
NSDictionary *dataCategoriesDictionary = [[NSDictionary alloc] initWithContentsOfFile:filepath];
self.choices = [[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]]; // LINE 55
[dataCategoriesDictionary release]; // HERE, the compiler says "Potential leak of an object allocated on line 55"

Даже если это не такНе было никакого смысла в том, что я мог передавать утечку переменной экземпляра, я все равно пытался добавить для нее оператор освобождения, и XCode все еще выдавал мне ту же ошибку.Что еще я мог просочиться?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Если выбор - это свойство с сохранением, то у вас есть утечка NSMutableDictionary.

[[NSMutableDictionary alloc] initWithDictionary

Либо авто-релиз, либо используйте временный.

self.choices = [[[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]] autorelease];

или (мой любимый)

self.choices = [NSMutableDictionary dictionaryWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory];

или

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]];
self.choices = tempDict;
[tempDict release];
1 голос
/ 21 сентября 2011

choices выглядит как объявленное свойство .Кажется, вы объявили это следующим образом:

В файле .h:
@property (nonatomic, retain) NSMutableDictionary *choices;

В файле .m:
@synthesize choices

В этом случае компилятор автоматически предоставляет метод установки:

-(void) setChoices:(NSMutableDictionary*)newValue
{
    if (choices != newValue) {
        [choices release];
        choices = [newValue retain];
    }
}

Из вашего кода self.choices неявно вызывает метод setChoices.Таким образом, счетчик хранения вновь выделенного NSMutableDictionary становится 2, а не 1, что приводит к утечке объекта.

0 голосов
/ 21 сентября 2011

Вы должны освободить переменную-член (ivar), к которой относится свойство choice. Таким образом, предполагая, что есть переменная-член _choice, затем освобождаем ее следующим образом:

[_choice release]

должно работать.

В качестве альтернативы, если вы переписали это так, это может прояснить причину утечки:

NSMutableDictionary * temp = [[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary 
self.choices = temp
[temp release]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...