弱到非类型类型以避免内存泄漏

时间:2015-01-07 11:18:03

标签: swift

在这种情况下,我有一个内存泄漏,如果我将引用传递给任何方法,那么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")
}
}

2 个答案:

答案 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
    }
}

我尝试了它并没有创建一个强大的参考周期。但我也尝试过!而不是?,这也没有造成,我希望有人在那里解释。