gpt4 book ai didi

ios - 在 block 、核心数据、swift中使用弱、强的 self 使用

转载 作者:行者123 更新时间:2023-12-01 18:44:18 24 4
gpt4 key购买 nike

目前,我正在通过以下方式获取核心数据

CoreDataStack.sharedIntance.backgroundContext.performBlock({
let fetchRequest = NSFetchRequest(entityName: "Schedule")
let sortDescriptor = NSSortDescriptor(key: "startTime", ascending: true)

fetchRequest.sortDescriptors = [sortDescriptor]
var result = [Schedule]()

mainContext.performBlockAndWait { [unowned self] in
do {
result = try mainContext.executeFetchRequest(fetchRequest) as! [Schedule]
success?(result)
} catch {
print("error is \(error)")
}
}
})

我收到一个错误

Reference to property mainContext in closure requires explicit self to make capture semantics explicit



我注意到一些解决方案,他们添加了 self对于 block 中的属性。

这样做好还是我们应该创建一个 weak or unowned避免保留循环以及处理这种情况的最佳方法是什么。

最佳答案

每次使用self在一个 block 中,您必须考虑该 block 的 future ,否则您可以创建一个引用循环并泄漏内存(这就是 Swift 要求您明确的原因)。引用循环最常发生在 block 捕获(持有强引用)self 时。 ,其他一些物体会捕获那个 block ,self捕获另一个对象。在该配置中,有一个包含 self 的循环。和另一个对象,所以两者都不能解除分配。

当 block 是“每次发生 X 时,请执行此操作”的处理程序时,最常发生这种情况。持有该 block 并执行通知的对象通常由想要被通知的事物所有。这可能是最常见的一种引用循环。一般通过制作self来解决虚弱的。
performBlock但是,不是这种功能。它执行 block 然后释放它。在 Swift 中,它是 @noescape (将来可能会以这种方式标记,并且您不需要在 noescape 闭包中使用 self.)。直到 block 执行,self无法释放,但在 block 执行后,循环立即中断。这可能正是您想要的。所以使用 self.这很好,没有理由增加弱引用的复杂性。

关于ios - 在 block 、核心数据、swift中使用弱、强的 self 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37837979/

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