gpt4 book ai didi

Swift 闭包 [unowned 单例]

转载 作者:可可西里 更新时间:2023-11-01 00:51:39 25 4
gpt4 key购买 nike

在 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 发现,核心数据管理器有一个问题......这种架构绝对没有问题。

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

最佳答案

可能值得研究一下如何定义单例。作为一般规则,我会这样做:

class MySingleton {
static let sharedInstance = MySingleton() //The singleton
}

这留下了干净的堆栈跟踪并且没有混淆。以供引用: http://krakendev.io/blog/the-right-way-to-write-a-singleton

编辑:

错误似乎在 BFSCoreDataManager 类中。在 observerContext: 中,您忘记了监听上下文。函数应该是:

func observeContext(context:NSManagedObjectContext) {

NSNotificationCenter.defaultCenter().addObserver(
self,
selector:"mergeChangesFromNotification:",
name: NSManagedObjectContextDidSaveNotification,
object: context) //context instead of nil
}

关于Swift 闭包 [unowned 单例],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36205464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com