2017-04-26 40 views
1

我有一個函數接受一個塊作爲參數。我可以使用尾隨閉包來傳入一段代碼,但在保留self時,該閉包必須使用weak參考。使用函數參數類型避免弱引用?

例如,見的MyClass2初始化:

class MyClass { 
    func subscribe(using block: @escaping() -> Void) { 
     DispatchQueue.global().async { 
      block() 
     } 
    } 
} 

let test = MyClass() 

class MyClass2 { 

    var someProperty = 0 

    init() { 
     // Weakly referenced 
     test.subscribe { [weak self] in 
      self?.update() 
     } 
    } 

    func update() { 
     self.someProperty += 1 
    } 
} 

MyClass2() 

然而,這仍然需要如果我通過在閉合件作爲像這樣的功能參數?:

class MyClass2 { 

    var someProperty = 0 

    init() { 
     // Avoid retain cycle? 
     test.subscribe(using: update) 
    } 

    func update() { 
     self.someProperty += 1 
    } 
} 

回答

1

整個前提你的問題(「但封閉必須使用一個弱引用」)是錯誤的。在你的第一個代碼中沒有任何理由使用weak self。這將是完全合理的:

init() { 
    test.subscribe { 
     self.update() 
    } 
} 

原因需要使用weak self是關閉引用self本身由self保留,造成保留週期;但這不是在這裏發生的。

相關問題