Приложение, кажется, утечка памяти - PullRequest
1 голос
/ 27 июня 2011

В среде сборки мусора я создаю приложение, использующее Core Data и Sync Services. Базовая модель и хранилище данных - это представление контактной информации адресной книги (как описано в Apple здесь ).

Цель приложения - синхронизировать контакты в адресной книге через службы синхронизации с нашим онлайн-сервисом. Это означает синтаксический анализ изменений (добавлений, обновлений, удалений) в хранилище базовых данных, которые впоследствии будут получены службами синхронизации (и наоборот).

Однако, кажется, что когда я создаю объекты Core Data, они никогда не освобождаются. Код, который я использую, выглядит следующим образом (я сократил утечку до следующей инструкции):


    SLSyncLog *syncLog = [SLSyncLog singletonFromContext:context];


+ (SLSyncLog *)singletonFromContext:(NSManagedObjectContext *)context {
    NSEntityDescription *syncDataDescription = [SLSyncLog entityInManagedObjectContext:context];
    return (SLSyncLog *)[SLSingletonLoader loadSingletonOfEntity:syncDataDescription fromContext:context];
}


+ (NSManagedObject *)loadSingletonOfEntity:(NSEntityDescription *)entity fromContext:(NSManagedObjectContext *)context {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    [request release];

    if (error) {
        [NSException raise:kSyncDataException format:@"Error retrieving %@ object", [entity name]];
    }

    if ([results count] > 1) {
        [NSException raise:kSyncDataException
                    format: @"There were %d %@ objects, instead of the expected one.", [entity name], [results count]];
    }

    NSManagedObject *log = nil;
    if ([results count] == 0) {
        /* Create the singleton object. */
        log = [NSEntityDescription insertNewObjectForEntityForName:[entity name]
                                            inManagedObjectContext:context];
    } else {
        log = [results objectAtIndex:0];
    }

    return log;
}

Насколько я понимаю, находясь в среде с сборкой мусора, он должен очистить все, что создано в этих методах. Это специфическая проблема Core Data?

Любая помощь будет оценена. Спасибо!

Ответы [ 2 ]

1 голос
/ 28 июня 2011

номер

CoreData будет удерживать ссылку на управляемые объекты, созданные внутри этого метода, до тех пор, пока экземпляр NSManagedObjectContext, с которым они связаны, не будет освобожден или сброшен.

1 голос
/ 27 июня 2011

Теоретически, вам следует возвращать один и тот же массив объектов каждый раз, потому что Базовые данные кэшируют их за кулисами.Если вы думаете, что на них больше не ссылаются, это не значит, что это не так.И они определенно не собираются уходить, пока вы не сохраните контекст управляемого объекта.

Кстати, правильный способ обработки ошибок - проверить возвращаемое значение для nil и только затем проверить * 1003.*.

...