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

时间:2015-04-07 06:46:53

标签: swift block weak-references retain-cycle

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

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

它说明了为具有潜在保留周期的块分配值的3种方法。由于1.,案例2.unowned self不会创建保留周期,但如果3.似乎没有办法打破保留周期(deinit是从未打印过)。如您所见,我甚至尝试创建一个本地无主参考。

这是期望的行为吗?是吗?#34;设计"?或者我错过了什么?

谢谢!

https://devforums.apple.com/message/1122247

交叉发布

1 个答案:

答案 0 :(得分:5)

是的,这是设计行为。

在不调用方法的情况下访问方法(如s.tempHandler)等同于{ x in s.tempHandler(x) }之类的闭包表达式。此处s未标记为unownedweak,因此会被闭包保留。如果您希望将其捕获为unownedweak,则必须明确写出闭包。