我的问题是关于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在控制台中打印的结果相同,并且内存仍然似乎没有被释放.

解决方法

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

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

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

ios – 核心数据导入 – 不释放内存的更多相关文章

  1. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  2. ios – CoreData有序关系 – 使用NSFetchRequest批量取消

    或者,是否存在批量不支持的API,它不是私有的?解决方法目前我有一个解决方案,但不是一个干净的解决方案:我希望按照有序关系中的20个小组进行批量修改.所以,每次我索引一个索引,它的索引除以20,我为接下来的20使用新的NSFetchRequest,并通过调用公共字段名称来解除它们.

  3. ios – 使用SQLite和CoreData进行批量插入

    我有一个使用sqlite作为持久性存储的CoreData模型.在对每条记录进行一些处理之后,我需要插入大量的行.有没有办法将这些命令发送到sqlite我需要加快处理时间,因为它需要几个小时才能完成.任何提示将不胜感激.谢谢解决方法将商店添加到商店协调员时,可以指定编译指示:(改编自PersistentStoreFeatures)我强烈建议您阅读“有效导入数据”.相关文档:NSSQLitePragm

  4. 核心数据 – iOS:由于Xcode 9中的Fetched Indexes,无法编译CoreData模型

    根据发行说明,Xcode9增加了对获取索引的支持:“ThedatamodeleditorpresentsaunifiedinterfaceforCoreData’snewfetchindexesfeatureaswellasitsexistingpropertyindexandentitycompoundindexfeatures.Olderdatamodelsaretranslatedintof

  5. 如何在Cocoa中使用Bindings CoreData实现iTunes风格的Source-List?

    让我们说,为了说明,我在Cocoa中编写了一个iTunes克隆应用程序,该应用程序由CoreData支持.为简化起见,假设有两个“部分”,“图书馆”,包括音乐,电影,广播等.第二部分称为“播放列表”,其中包含用户生成的播放列表.所以SourceList本身通常会用NSOutlineView实现,这通常很简单.源列表的“库”部分实际上并不包含用户生成的任何内容,只包含应用程序的“功能”(实质上),其中“播放列表”部分仅包含用户创建的自定义列表.如何用Bindings和CoreData做到这一点?

  6. ios – 未为测试目标生成核心数据类

    我使用CoreData的自动生成的类.除测试目标外,我的项目还有3个目标.对于每个目标,正确生成CoreData类,我通过检查DerivedData文件夹进行验证.但是,尽管在核心数据模型文件中打勾,但不会为测试目标生成类.当我尝试引用测试目标中的一个CoreData类时,这会导致“未声明的标识符”和“使用未声明的类型”错误.我该如何解决这个问题?

  7. ios – 尽管匹配x-coredata id,“CoreData不支持持久的跨店关系”

    有关AbstractSource,我在源代码中没有触摸/控制?我是通过调用来创建Quote和BookinitWithEntity:insertIntoManagedobjectContexteach.)>我注意到错误描述还包括几个“相对的”x-coredataid(形式为“x-coredata:///……”如果是这样,我怎么能影响“绝对”和“绝对”之间的任何选择“相对”x-coredataid?

  8. ios – 我可以安全地在@try catch块中包装’CoreData无法解决错误’错误

    )是的,我偶尔会得到’CoreData无法完成故障’的错误.在我的特定应用程序中,这通常发生在一种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续前进.我想通过在@try-catch块中包装数据绑定的循环内部并且只跳过我得到CoreData错误的行来完成此操作.我可以使用CoreData安全地执行此操作吗?

  9. ios – 使用UITableView和NSOrderedSet进行核心数据排序

    我还需要回应-tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:还是表视图自动处理的模型重新排序?我可以检查核心数据模型文件中的“有序”复选框,并期望它将更改从表格视图传输到商店,还是要做更多的事情?

  10. ios – swift中自定义NSManagedObject类核心数据的问题

    我最近开始学习swift,我想使用一些用ObjectiveC编写的数据模型类.当我尝试从输入框保存数据时,我遇到了一个奇怪的错误:Users.hUsers.m这是数据模型截图:这是保存功能:来自lldb的代码:解决方法这与swift无关.如果更新coredata模型而不定义AppleeDoc中提到的合并/版本控制规则,则需要在设备或模拟器上删除并重新安装应用程序.查看错误消息:从模拟器/或设备中删

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部