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