簡體   English   中英

弱到非類類型以避免內存泄漏

[英]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通過可變對象refObserver對象保存到做構成的封閉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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM