簡體   English   中英

持有使用閉包的本地對象的強引用[Swift]

[英]Holding a Strong ref to local object that uses closure [Swift]

我對持有使用閉包的本地對象的強引用有一個疑問。 我有以下代碼,其中對象B使用一個方法關閉了類型為A的本地對象。對象A中的方法使用異步操作執行一些網絡任務,然后將關閉操作返回給對象b。 由於對象A在B中的方法中是本地的,並且由於我在對象A的異步任務中使用了[weak self](以防止保留周期),因此該對象被釋放。

為了確保僅在完成關閉操作后釋放本地A對象,我應該在以下代碼中進行哪些更改?

這是重要代碼的一部分:

class A {
    var restAPI: RestAPI?

    func fetchNews(completion: (_ json: [String:Any])->()) {
        // .....
        self.restAPI.fetch(url: url, results: { [weak self] (json) in // 
            completion(json)
        })
        // .....
    }
}

class B {
    // .... 
    // ... call to updateNews()

    func updateNews() {
        let aFetcher: A() 
        aFetcher.fetchNews(completion : { 
            // <<<< // aFetcher gets released and closue never called
            // parse...
        }
    }
}

聲明aFetcher在FUNC updateNews的范圍設()
updateNews( )的范圍達到終點時,將釋放aFetcher。 您的內部提取功能中存在[弱自我] 在此階段,將釋放aFetcher,因為updateNews()完成其執行並且對該對象沒有強引用。

您只需要向類B添加變量aFetcher即可確保對aFetcher有很強的引用。

class B {

    // MARK: - Vars
    private let aFetcher = A()

    // MARK: - Public
    func updateNews() {
        aFetcher.fetchNews(completion : {
            // parse...
        }
    }
}

您需要在課程的頂層上有一個強大的參考。

但是,不要永久保留引用並可靠地保留和釋放該引用,請在class B添加一個可選的存儲屬性,並在完成閉包中將其設置為nil

class B {

    var fetcher : A?

    // MARK: - Public
    func updateNews() {
        fetcher = A()
        fetcher!.fetchNews(completion : { [unowned self] in
            // parse...

            self.fetcher = nil
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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