• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 用于获取 NSManagedObject 的获取请求的 NSPredicate 上的内存泄漏

[复制链接]
菜鸟教程小白 发表于 2022-12-12 16:49:11 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

根据仪器,我在 NSPredicate 上有内存泄漏。如何避免这种内存泄漏?出了什么问题?

代码如下: 注意:

默认管理器是单例

self.editingContext 是具有父上下文(主上下文)的子上下文

这个函数(JobType)的输出是在父 NSManagedObject 中使用的 NSManagedObject(例如 job.type = jobType)

func defaultJobType() -> JobType?
{
  let fetchRequest = NSFetchRequest(entityName: JobType.entityName());

  let predicate = NSPredicate(format: "jobTypeID = %@ && (archived = nil || archived = 0)", DefaultManager.instance.defaultValues[DJobType]!.uppercaseString);

  fetchRequest.predicate = predicate;

  do{
    return try self.editingContext?.executeFetchRequest(fetchRequest).first as? JobType;
  }
  catch let error as NSError
  {
    Logger.logApplicationError("Error in getting default job Type", detailMessage: error.localizedDescription);
  }
  catch
  {
    Logger.logApplicationError("Error in getting default job Type", detailMessage: "No detail error found");
  }

  return nil;
}

函数defaultJobType()的调用者

func createDefaultJob() -> Job
{
    let job = Job.MR_createInContext(self.editingContext!) as! Job;
    job.assignedUserID = LoginManager.sharedInstance().currentUserID;
    job.createdBy = LoginManager.sharedInstance().currentUserID;
    job.createdOn = NSDate();
    job.lastModifiedByUser = LoginManager.sharedInstance().currentUserID;

    if let defaultCallout = self.servicesDefault.defaultCalloutFee() {
        if let jobCalloutFee = defaultCallout.createJobCalloutFee()
        {
            job.addJobCalloutFeesObject(jobCalloutFee);
        }
    }

    job.type = self.servicesDefault.defaultJobType();

    return job;
}

并且在Objective C ViewController中使用了createDefaultJob()。

请帮忙



Best Answer-推荐答案


我也遇到了同样的问题。 iOS 9 之前是没有的。还有雷达here

我设法通过重新配置我的核心数据堆栈来解决它。基本上,当我使用父托管上下文(主)和嵌套的子托管上下文时,我遇到了问题:

我将父上下文和子上下文更改为两个(非嵌套)独立的上下文,共享同一个持久性存储协调器。我手动合并更改如下:

let moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
moc.persistentStoreCoordinator = coordinator

let privateMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMoc.persistentStoreCoordinator = coordinator

NSNotificationCenter.defaultCenter().addObserverForName(NSManagedObjectContextDidSaveNotification, object: moc, queue: nil) { notification in
privateMoc.performBlock {
                privateMoc.mergeChangesFromContextDidSaveNotification(notification)
            }
    }

我运行泄漏仪器,泄漏消失了。希望这会有所帮助。

关于ios - 用于获取 NSManagedObject 的获取请求的 NSPredicate 上的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272197/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap