Я не могу найти эту утечку памяти. Я думал, что выпускаю все правильно - PullRequest
0 голосов
/ 16 февраля 2011

Я не могу найти эту утечку памяти. Я думал, что выпускал вещи правильно. Вот блок кода, о котором идет речь.

 - (void) createProvince:(NSString *) provinceName {

    // if province does not exist create it
    if ([self hasProvince: provinceName] == NO) {

        // get the province object
        NSPredicate *predicate;
        predicate = [NSPredicate predicateWithFormat:@"Name == %@", provinceName];

        NSMutableArray *provArray = [[NSMutableArray alloc] init];
        [provArray setArray: [CoreDataHelper searchObjectsInContext:@"Province" :predicate :@"Name" :YES :[self managedObjectContext]]];

        NSIndexPath *indexPath;
        indexPath = [NSIndexPath indexPathForRow:0 inSection: 0];

        [[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];
        [provArray release];

        // create a cities array to hold its selected cities
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [[self cities] addObject: array];
        [array release];
    }
}

Утечки здесь:

[[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];

NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];

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

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Давайте посмотрим на это:

NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];
[array release];

Когда вы alloc объект, его счет сохранения устанавливается на 1:

NSMutableArray *array = [[NSMutableArray alloc] init]; # retain count of array is 1

Когда вы добавляете объект в NSMutableArray, счетчик retain этого объекта увеличивается:

[[self cities] addObject: array]; # retain count of array is 2

Когда вы release array, его счетчик хранения уменьшается:

[array release]; # retain count is now 1

Как только ваш метод заканчиваетсяу вас все еще есть этот массив, принадлежащий изменяемому массиву [self cities].

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

В какой-то момент вам нужно очистить или освободить изменяемый массив, освобождая объектысодержащиеся в.Если cities является свойством класса, возможно, release это когда класс освобожден.

EDIT

Исправлена ​​ошибка init - alloc.

2 голосов
/ 16 февраля 2011

Есть ли у вас метод dealloc, который правильно все выпускает?

Обратите внимание, что утечки показывают вам, где что-то было выделено. Это не показывает вам, где это было на самом деле утечка; что удерживать не было явно сбалансировано.

...