在这种情况下,我有一个内存泄漏,如果我将引用传递给任何方法,那么self会随之增加它的引用计数,我猜怎样才能使非类类型变为弱势
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")
}
}
答案 0 :(得分:2)
通过查看代码,您似乎在讨论保留周期,其中Test
对象通过变量Observer
保留在ref
对象上,{{1} } object持有通过执行Observer
形成的闭包,该self.callback
保留在self
。
通常在这种情况下,您不希望闭包属性本身变弱。相反,您希望闭包捕获对self
的弱引用(Test
对象将“回调”传递给另一个对象)。但是,这在某种程度上令人困惑,因为我们没有明确地使用闭包语法(相反,您通过访问实例上的方法而不是调用它来获得闭包)。在this question中介绍了在这种情况下捕获self
弱引用的问题。
最佳解决方案是:
ref = Observer(method: {[unowned self] in self.callback($0)}, context: self)
答案 1 :(得分:0)
试试这个:
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
}
}
我尝试了它并没有创建一个强大的参考周期。但我也尝试过!而不是?,这也没有造成,我希望有人在那里解释。