Базовый запрос выборки данных использует много памяти - PullRequest
2 голосов
/ 05 февраля 2012

Я пытаюсь понять проблему, возникающую у меня с Core Data и простым запросом на выборку:

Мне нужно отобразить некоторые записи, и я выполняю эти строки кода

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Venue"                                     
inManagedObjectContext:self.managedObjectContext]];

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id_" ascending:YES]; 

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];  
[sortDescriptor release];
sortDescriptor = nil;

[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release];
sortDescriptors = nil;

[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

Пока все хорошо, но в Instruments я вижу, что перед загрузкой записей моя память составляет 9 МБ, затем память скачет до 44 МБ (!!) и все еще там. Но я хочу выпустить все записи из памяти, потому что они мне больше не нужны. Я что-то пропустил? Я думал, что Core Data выпускает записи после того, как они больше не нужны. Я попытался выполнить цикл for для освобождения каждого ManagedObject, но они уже имеют +1 счет, что означает, что они скоро будут освобождены.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

вы должны отпустить запрос [fetchRequest release];

1 голос
/ 08 февраля 2012

Если вам больше не нужны ваши NSManagedObjects, вы можете вручную превратить их обратно в fault.т.е. удалите их из NSManagedObjectContext.В следующий раз, когда вы захотите их, они снова будут загружены из постоянного хранилища.

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

Для повторной ошибки используйте это (иознакомьтесь с документами API об их использовании)

- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...