清除NSManagedContext中的内存(创建后释放内存)

时间:2014-10-16 05:53:10

标签: ios core-data memory-management out-of-memory nsmanagedobject

我无法找到令人满意的答案,所以写了一个新问题。

当我的应用程序第一次启动时,我需要将数据填充到coredata DB并且大小非常大(大约10mb),有多个文件,所有这些都需要插入到coredata中。

现在我的问题是我在处理4或5 MB后得到内存警告。创建的实体似乎仍然存在,我希望一旦完成一大块数据就清除它们(因为它是我可以在每个文件后清除的多个文件)。

这个问题不允许我完成进程,并且由于内存过载而总是崩溃。

我正在使用iPad mini和最新的xcode和ARC。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

为什么不简单地创建一个临时上下文,插入一部分数据(可能只有一个实体),然后保存它,将其设置为nil并创建另一个?或者您可以尝试使用"重置"方法,我从来没有尝试过,但据我所知,它使上下文"忘记"所有对象,所以它应该像解除分配它们一样工作。