Основные данные и утечка памяти - PullRequest
1 голос
/ 08 февраля 2011

Я использую Core Data, извлекаю некоторые данные в NSArray и затем зацикливаю их.

    ......
    NSMutableArray *persons = [[NSMutableArray alloc] init];
NSError *error;
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person"   inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *info in fetchedObjects) {

        ToggleButtonInfo *btn = [[ToggleButtonInfo alloc] init];

        btn.buttonName = [info valueForKey:@"name"];

        [persons addObject:btn];
    }        
    [fetchRequest release];

    return persons;

Затем я отправляю людей в компонент, который отображает кнопки.В инструментах я получаю следующую утечку памяти enter image description here

, если заменю btn.buttonName = [info valueForKey: @ "name"]; на btn.buttonName =@ "что-то еще"; утечка отчаивается.Обратите внимание, что NSSQLCore.Утечки увеличиваются каждый раз, когда я вызываю этот метод, чтобы обновить представление.Я хочу упомянуть, что таблица «Персона» связана с другой таблицей, один ко многим.В компоненте, когда я собираюсь загрузить новые данные, я выпускаю NSMutableArray, и это не выглядит проблемой.я должен выпустить что-то еще здесь?что мне не хватает?

ОБНОВЛЕНИЕ ******************************************* вот скриншот инструментов.Похоже, что пользовательские объекты были выпущены правильно.проблема связана с Core Data, не так ли?enter image description here .. и входя в строку NSSt: enter image description here

Ответы [ 4 ]

3 голосов
/ 08 февраля 2011

Утечка памяти, по своей сути, является несбалансированным удержанием. Где вы получаете объект от , не так важно, как то, что вы делаете с ним, пока он жив.

Исходя из кода, которым вы поделились, лучше всего предположить, что свойство buttonName чрезмерно сохраняется в ToggleButtonInfo. Вам следует внимательно изучить срок службы свойства buttonName ToggleButtonInfo. Правильно ли вы выпустили его в dealloc ToggleButtonInfo?

Отображение большего количества кода поможет.

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

Просматривая ваш код, я вижу несколько мест, где вы звоните alloc.Каждый раз, когда вы звоните alloc, new или copy, вы должны звонить release или autorelease.Я предлагаю изменить NSMutableArray *persons = [[NSMutableArray alloc] init]; на NSMutableArray *persons = [[[NSMutableArray alloc] init] autorelease];.

Объекты с автоматическим выпуском гарантированно будут доступны в течение всего времени вызова метода.

Также, быстрое предложение: Вам следует проверить Build and analyze в меню Build, если у вас нетт.

0 голосов
/ 09 февраля 2011

Не должна ли быть ваша обратная линия?

return [persons autorelease];
0 голосов
/ 09 февраля 2011

Я не знаю, как объяснить ваш вывод относительно [info valueForKey: @ "name"] против @ "что-то еще" , но похоже, что вы протекают Btn. После [people addObject: btn]; у вас должно быть [btn release];

Добавление btn к сотрудникам NSMutableArray приведет к увеличению сохраняемого счета btn (до тех пор, пока он не будет удален из людей). Но -alloc возвращает btn с счетом сохранения 1, что делает ваш метод его владельцем.

...