weak to non class types to avoid memory leak
weak to non class types to avoid memory leak
在这种情况下我遇到了内存泄漏,如果我传递对任何方法的引用,self 会随之而来,这会增加它的引用计数我猜,我怎样才能使非 class 类型成为虚弱
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
}
在另一个 class 中,我猜 self.callback
创建了对调用者对象的强引用并继续传递。
var observer = Observer(method: self.callback, context: self) //pass of self.callback is a strong reference
编辑:
根据以上内容,我尝试使用一个示例,使用两个 classes 进一步阐明情况。 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")
}
}
试试这个:
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
}
}
我试过了,它没有创建强引用循环。但我也试过!而不是 ?,这也不是原因,我希望有人能解释一下。
从您的代码来看,您似乎在谈论一个保留周期,其中 Test
对象通过变量 ref
保存到 Observer
对象,Observer
对象持有通过执行 self.callback
形成的闭包,它持有 self
.
通常在这种情况下,您不希望闭包 属性 本身很弱。相反,您希望闭包捕获对 self
的弱引用(Test
对象正在将 "callback" 传递给另一个对象)。然而,这有点令人困惑,因为我们没有明确使用闭包语法(相反,您通过访问实例上的方法而不是调用它来获得闭包)。 this question.
中介绍了在这种情况下捕获对 self
的弱引用的问题
最佳解决方案是:
ref = Observer(method: {[unowned self] in self.callback([=10=])}, context: self)
在这种情况下我遇到了内存泄漏,如果我传递对任何方法的引用,self 会随之而来,这会增加它的引用计数我猜,我怎样才能使非 class 类型成为虚弱
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
}
在另一个 class 中,我猜 self.callback
创建了对调用者对象的强引用并继续传递。
var observer = Observer(method: self.callback, context: self) //pass of self.callback is a strong reference
编辑:
根据以上内容,我尝试使用一个示例,使用两个 classes 进一步阐明情况。 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")
}
}
试试这个:
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
}
}
我试过了,它没有创建强引用循环。但我也试过!而不是 ?,这也不是原因,我希望有人能解释一下。
从您的代码来看,您似乎在谈论一个保留周期,其中 Test
对象通过变量 ref
保存到 Observer
对象,Observer
对象持有通过执行 self.callback
形成的闭包,它持有 self
.
通常在这种情况下,您不希望闭包 属性 本身很弱。相反,您希望闭包捕获对 self
的弱引用(Test
对象正在将 "callback" 传递给另一个对象)。然而,这有点令人困惑,因为我们没有明确使用闭包语法(相反,您通过访问实例上的方法而不是调用它来获得闭包)。 this question.
self
的弱引用的问题
最佳解决方案是:
ref = Observer(method: {[unowned self] in self.callback([=10=])}, context: self)