![](/img/trans.png)
[英]CoreData generated class - Is there memory leak risk of not using weak in inverse relationship?
[英]weak to non class types to avoid memory leak
在這種情況下,我會發生內存泄漏,如果我傳遞了對任何方法的引用,那么自帶的自我將增加它的引用計數(我猜想),如何使非類類型變得脆弱
public class Observer {
weak private var method: ((message: AnyObject) -> ())! //error here
weak private var context: AnyObject!
}
public init(method: (AnyObject -> ())?, context: AnyObject?) {
self.method = method
self.context = context
}
在另一個類中,我想self.callback
會創建對調用方對象的強引用並繼續進行下去。
var observer = Observer(method: self.callback, context: self) //pass of self.callback is a strong reference
編輯:
在上面的工作中,我嘗試使用一個示例,使用兩個類進一步闡明情況。 deinit
永遠不會被調用。
class Test {
private var ref: Observer?
init() {
ref = Observer(method: self.callback, context: self)
}
func callback(message: AnyObject) {
}
deinit {
println("deinit test")
}
}
public class Observer {
private var method: ((message: AnyObject) -> ())?
weak private var context: AnyObject!
public init(method: (AnyObject -> ())?, context: AnyObject?) {
self.method = method
self.context = context
}
deinit {
println("deinit observer")
}
}
從看你的代碼,好像你是在談論一個保留周期在Test
對象保存到Observer
通過可變對象ref
的Observer
對象保存到做構成的封閉self.callback
,它保存到self
。
通常,在這種情況下,您不希望閉包屬性本身很弱。 相反,您希望閉包捕獲對self
的弱引用( Test
對象將對自身的“回調”傳遞給另一個對象)。 但是,這有點令人困惑,因為我們沒有顯式地使用閉包語法(而是通過訪問實例上的方法而不是調用它來獲得閉包)。 這個問題涵蓋了在這種情況下獲取對self
的弱引用的問題 。
最好的解決方案是:
ref = Observer(method: {[unowned self] in self.callback($0)}, context: self)
嘗試這個:
public class Observer {
private var method: ((message: AnyObject) -> ())?
weak private var context: AnyObject!
public init(method: (AnyObject -> ())?, context: AnyObject?) {
self.method = method
self.context = context
}
}
我試過了,它並沒有建立一個強大的參考周期。 但是我也嘗試過! 而不是?,那也沒有引起,我希望有人在那里解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.