ios – 核心数据导入 – 不释放内存

前端之家收集整理的这篇文章主要介绍了ios – 核心数据导入 – 不释放内存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是关于Core Data和内存没有被释放.我在做一个同步过程,从返回一个json的WebService导入数据.我在内存中加载要导入的数据,循环并创建NSManagedObjects.导入的数据需要创建与其他对象有关系的对象,总共有大约11.000个.但是为了隔离问题,我现在只是创建第一和第二级的项目,把关系留下,那些是9043个对象.

我开始检查使用的内存量,因为应用程序在进程结束时崩溃(使用完整的数据集).第一个内存检查是在内存中加载json之后,所以测量只是考虑到创建,并将对象插入到Core Data中.我用来检查使用的内存是这段代码(source)

-(void) get_free_memory {

    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),TASK_BASIC_INFO,(task_info_t)&info,&size);
    if( kerr == KERN_SUCCESS ) {
        NSLog(@"Memory in use (in bytes): %f",(float)(info.resident_size/1024.0)/1024.0 );
    } else {
        NSLog(@"Error with task_info(): %s",mach_error_string(kerr));
    }
}

我的设置:

> 1持久店协调员
> 1 Main ManagedObjectContext(MMC)(NSMainQueueConcurrencyType用于读取(只读)应用程序中的数据)
> 1背景ManagedObjectContext(BMC)(NSPrivateQueueConcurrencyType,undoManager设置为nil,用于导入数据)

BMC独立于MMC,所以BMC不是MMC的子环境.而且他们不共享任何父上下文.我不需要BMC来通知MMC的更改.所以BMC只需要创建/更新/删除数据.

者平台:

> iPad 2和3
> iOS,我已经测试将部署目标设置为5.1和6.1.没有区别
> XCode 4.6.2
> ARC

问题:
导入数据时,使用的内存不会停止增加,即使在进程结束后,iOS似乎也无法耗尽内存.哪些数据样本增加,导致内存警告和应用程序关闭之后.

研究:

>苹果文档

> Efficiently importing Data
> Reducing Memory Overhead

>将数据导入到Core Data(Stackoverflow)时,请记住要记住的几点
>测试完成并分析内存释放.他似乎有与我同样的问题,他发送了一个苹果Bug报告,没有从苹果回应. (Source)
>导入和显示大数据集(Source)
>表示导入大量数据的最佳方式.虽然他提到:

“I can import millions of records in a stable 3MB of memory without
calling -reset.”

这让我觉得这可能是某种可能的? (Source)

测试:

数据样本:共创建9043个对象.

>关闭创建关系,因为文档说他们是“昂贵的”
>没有抓取正在进行

码:

- (void)processItems {
    [self.context performBlock:^{
        for (int i=0; i < [self.downloadedRecords count];) {
            @autoreleasepool
            {
                [self get_free_memory]; // prints current memory used
                for (NSUInteger j = 0; j < batchSize && i < [self.downloadedRecords count]; j++,i++)
                {
                    NSDictionary *record = [self.downloadedRecords objectAtIndex:i];

                    Item *item=[self createItem];
                    objectsCount++;

                    // fills in the item object with data from the record,no relationship creation is happening
                    [self updateItem:item WithRecord:record];

                    // creates the subitems,fills them in with data from record,relationship creation is turned off
                    [self processSubitemsWithItem:item AndRecord:record]; 
                }
                // Context save is done before draining the autoreleasepool,as specified in research 5)
                [self.context save:nil];

                // Faulting all the created items
                for (NSManagedObject *object in [self.context registeredObjects]) {
                    [self.context refreshObject:object mergeChanges:NO];
                }
                // Double tap the prevIoUs action by reseting the context
                [self.context reset];
            }
        }
    }];
    [self check_memory];// performs a repeated selector to [self get_free_memory] to view the memory after the sync 
}

Measurment:

它从16.97 MB到30 MB,同步后降到28 MB.每5秒钟重复一次get_memory调用将内存维持在28 MB.

其他测试没有运气:

>如研究2所示,重新创建持久性商店没有任何效果
>测试让线程稍等一下看看内存是否恢复,例4)
>整个过程设置上下文为零
>完成整个过程,而不会在任何时候保存上下文(放弃信息).这实际上是因为结果维持较少的内存量,剩下的是20 MB.但它仍然不减少和…我需要的信息存储:)

也许我错过了一些东西,但我已经测试了很多,遵循指导方针之后,我会期望内存再次下降.我已经运行分配工具来检查堆的增长,这似乎也很好.也没有内存泄漏.

我没有想法来测试/调整…我真的很感激任何人可以帮助我的想法,我可以测试什么,或者可能指出我做错了什么.或者它就是这样,它应该是工作…我怀疑…

感谢任何帮助.

编辑

我使用仪器来配置Activity Monitor模板的内存使用情况,“Real Memory Usage”中显示的结果与使用get_free_memory在控制台中打印的结果相同,并且内存仍然似乎没有被释放.

解决方法

好吧,这是非常尴尬的…僵尸已启用计划,在他们关闭的参数,但在诊断“启用僵尸物体”被检查…

关闭功能可保持内存稳定.

感谢那些读过这个问题并试图解决的问题!

原文链接:https://www.f2er.com/iOS/335796.html

猜你在找的iOS相关文章