在swift中使用函数作为块时,避免保留周期

Sas*_*ats 5 weak-references block retain-cycle swift

以下是您可以在游乐场中运行的代码示例

import Foundation

class TempNotifier {  
    var onChange: (Int) -> Void = {t in }
    var currentTemp = 72

    init() {
        // 1.
        onChange = { [unowned self] temp in
            self.currentTemp = temp
        }

        // 2.
        onChange = {[unowned self] temp in
            self.tempHandler(temp)
        }

        // 3.
        unowned let s = self
        onChange = s.tempHandler
    }

    deinit {
        println("deinit")
    }

    private func tempHandler(temp: Int) {
        self.currentTemp = temp
    }
}

var tN: TempNotifier? = TempNotifier()
tN = nil
Run Code Online (Sandbox Code Playgroud)

它说明了为具有潜在保留周期的块分配值的3种方法.大小写1.并且2.不会创建保留周期,unowned self但是如果3.看起来没有办法打破保留周期(deinit从不打印).如您所见,我甚至尝试创建一个本地无主参考.

这是理想的行为,是"按设计"吗?或者我错过了什么?

谢谢!

https://devforums.apple.com/message/1122247交叉发布

new*_*cct 6

是的,这是设计的行为.

在不调用它的情况下访问方法就像s.tempHandler是一个闭包表达式{ x in s.tempHandler(x) }.这里s没有标记unownedweak因此被封闭物保留.如果您希望将其捕获为unownedweak,则必须明确写出闭包.