簡體   English   中英

在塊,核心數據,swift中使用弱,強自我使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM