[英]using weak, strong self usage in block, core data, swift
目前,我正在通過以下方式獲取核心數據
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)")
}
}
})
我收到了一個錯誤
在閉包中引用屬性mainContext需要顯式self來使捕獲語義顯式化
我注意到一些解決方案,他們為塊中的屬性添加了self
。
這樣做是好還是我們應該創建一個weak or unowned
以避免保留周期,以及處理這種情況的最佳方法是什么。
每次在塊中使用self
時,必須考慮該塊的未來,或者可以創建引用循環和泄漏內存(這就是Swift要求您明確的原因)。 當一個塊捕獲(保持一個強引用) self
,一些其他對象保持在該塊上,並且self
保持在另一個對象上時,最常發生引用循環。 在該配置中,有一個包含self
和另一個對象的循環,因此都不能解除分配。
當塊是“每次X發生時,請執行此操作”的處理程序時,通常會發生這種情況。 持有該塊並執行通知的對象通常由想要通知的事物所擁有。 這可能是最常見的參考循環。 它通常通過self
弱化來解決。
然而, performBlock
不是這種功能。 它執行塊然后釋放它。 在Swift術語中它是@noescape
(並且在未來它可能被標記為這樣,你不需要在noescape閉包中使用self.
)。 在塊執行之前,不能釋放self
,但是在塊執行之后,循環立即被中斷。 這可能正是你想要的。 所以使用self.
這里很好,沒有理由添加弱引用的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.