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)