在提取请求中使用NSPredicate的内存泄漏来获取NSManagedObject

根据仪器,我在NSPredicate上有内存泄漏。 我怎样才能避免这种内存泄漏? 什么地方出了错?

代码如下:注意:

默认pipe理器是单身人士

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()。

请帮忙

我刚刚遇到同样的问题。 这在iOS 9之前还没有。这里还有一个雷达

我设法通过重新configuration核心数据堆栈来解决这个问题。 基本上,当我使用父级托pipe上下文(main)和嵌套的子级托pipe上下文时,我遇到了问题:

我将父母和子女上下文更改为共享相同持久性存储协调员的两个(不嵌套)单独的上下文。 我手动合并更改如下:

 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) } } 

我运行泄漏仪器,泄漏消失了。 希望这可以帮助。