0

Мне не удалось найти удовлетворительный ответ на этот вопрос, чтобы написать новый вопрос.Очистить память в NSManagedContext (освободить память после создания)

Когда мое приложение запускается с первого раза, мне нужно заполнить данные в базу данных coredata, а размер очень большой (около 10 Мб), есть несколько файлов, и все необходимо вставить в coredata.

сейчас моя проблема в том, что я получаю предупреждение о памяти после обработки 4or5 MB. создаваемые объекты, кажется, все еще живы, и я хочу их очистить, как только завершается кусок данных (так как это несколько файлов, которые я могу очистить после каждого файла).

Эта проблема не позволяет мне завершить процесс, и он всегда сбой из-за перегрузки памяти.

Я использую iPad mini и последние xcode и ARC.

Любая помощь приветствуется.

+0

Основные данные управляют памятью, используемой графиком объекта, с использованием концепции «faulting». Ваша заявка находится в полном контроле над тем, что является ошибкой, а что нет. https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html – quellish

ответ

0

Сначала удалите все объекты перед загрузкой своей страницы. После удаления вставьте данные всех объектов в ваши основные данные.

- (void) deleteAllObjects: (NSString *) entityDescription { 


    LoginAppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
    self.managedObjectContext = appDelegate.managedObjectContext; 

    NSManagedObjectContext *context =[appDelegate managedObjectContext]; 

    NSEntityDescription *entityDesc =[NSEntityDescription entityForName:entityDescription 
              inManagedObjectContext:context]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDesc]; 

    NSError *error; 
    NSArray *items = [self.managedObjectContext executeFetchRequest:request error:&error]; 

    for (NSManagedObject *managedObject in items) { 
     [managedObjectContext deleteObject:managedObject]; 
     //NSLog(@"%@ object deleted",entityDescription); 
    } 
    if (![managedObjectContext save:&error]) { 
     //NSLog(@"Error deleting %@ - error:%@",entityDescription,error); 
    } 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 

    [self deleteAllObjects:@"Data"]; 
    //do ur code 
    [self insertYourData]; 
} 
0

Почему вы не просто создать временный контекст, вставить какую-то часть данных (может быть один объект только), а затем сохранить его, установить его в ноль и создать еще одну? Или вы можете попробовать использовать метод «сброса», я никогда не пробовал, но, как я понимаю, он заставляет контекст «забывать» все объекты, поэтому он должен работать, как освобождение от них.

+0

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

Смежные вопросы