【发布时间】:2016-07-12 08:31:14
【问题描述】:
在 Swift 中遇到递归内存泄漏问题,其中一个单例在另一个单例的闭包内被调用。
NetworkManager.sharedInstance.doThingWithCompletion(urlString) { [unowned self] (complete) -> Void in
if complete == true {
if self.fetchedResultsController.fetchedObjects?.count > 0 {
CoreDataManager.sharedInstance.save(self.dictionary, completion: { (complete) -> Void in
})
}
}
}
如何将单例作为无主添加到捕获列表中?我应该这样做吗?
编辑
Quantaliinuxite 发现,Core Data Manager 有一个问题……这种架构绝对没有问题。
static let sharedInstance = BFSCoreDataManager()
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
// MARK: - Saving
func observeContext(context:NSManagedObjectContext) {
NSNotificationCenter.defaultCenter().addObserver(
self,
selector:"mergeChangesFromNotification:",
name: NSManagedObjectContextDidSaveNotification,
object: nil) // ** PROBLEM WAS HERE **
}
func mergeChangesFromNotification(notification:NSNotification) {
dispatch_async(dispatch_get_main_queue()) {
self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification)
}
}
【问题讨论】:
-
我们如何将单例定义为“泄漏”?就其性质而言,它们永远不会被释放......
-
是的,好点。要定义它,调用内部单例方法会使内存呈指数级增长,直到崩溃。即使方法为空。
-
并且 CDM 单例在任何时候都不会调用您的 NetworkManager?您可以为调试做的事情是查看堆栈跟踪,看看整个递归恶作剧是关于什么的。
-
只是为了后代 CDM 总是 NetworkManager 的下风。
标签: swift memory-management closures