簡體   English   中英

遞歸協議的快速內存管理

[英]Swift Memory Management for Recursive Protocols

考慮swift中的以下類,它與自身保持遞歸關系

class OctupPromisable {

    var promise: OctupPromisable?

    weak var chainedPromise: OctupPromisable?

    func then(octupPromisable: OctupPromisable) -> OctupPromisable? {
        self.promise = octupPromisable
        octupPromisable.chainedPromise = self
        return self.promise
    }

    func start() {
        if nil == self.chainedPromise {
            self.fire(nil)
        }else {
            self.chainedPromise!.start()
        }
    }
}

用作這樣的:

OctupPromisable()
.then(OctupPromisable())
.then(OctupPromisable())
.start()

當我在chainedPromise弱的情況下調用start時,它總是導致chainedPromise為nil,因此start方法永遠不會遞歸。

使chainedPromise變強,會導致start方法遞歸並正常工作。 但是這樣做我是不是會創建一個強大的循環關系導致內存泄漏? 如果是這樣,可以做些什么來實現遞歸並避免內存泄漏?

謝謝!

使鏈接過程變得強大,但在使用它之后,將其設置為nil 你完成了它,所以你不需要再擁有一個強大的參考。 如果沒有其他強引用,則將取消分配該對象。

如果執行后不需要保留引用,則可以使用強引用並以遞歸方式釋放內部promise,因此當第一個promise取消分配時,它不會導致內存泄漏。

我無法測試代碼,但它是這樣的:

class OctupPromisable {

  weak var promise: OctupPromisable? // Make it weak to avoid reference cycle
  var chainedPromise: OctupPromisable? // Make it a strong reference
  func start() {
    if nil == self.chainedPromise {
      self.fire(nil)
    } else {
      self.chainedPromise!.start()
      self.chainedPromise = nil // Will be deallocated after all 'start' calls 
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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