如何在Swift中设置对闭包/函数的弱引用?

时间:2014-11-19 10:48:52

标签: ios swift closures

HMSegmentedControl中,我想将segmentedControl.indexChangeBlock设置为实例方法来处理操作。 官方的例子是:https://github.com/HeshamMegid/HMSegmentedControl/blob/master/HMSegmentedControlExample/HMSegmentedControlExample/ViewController.m(第63~68行),但这是Objective-C。

在斯威夫特,功能是一等公民。所以我想为这个块属性设置一个实例方法 但是我的代码会导致循环引用,似乎我应该定义一个弱引用:

class ExampleVC: UIViewController {
    var segmentedControlIndex: Int = 0

    override func viewDidLoad() {
      let segmentedControl3 = HMSegmentedControl(sectionImages: ... , sectionSelectedImages: ... )
      segmentedControl3.frame = ...
      segmentedControl3.indexChangeBlock = someInstanceMethod
    }

    func someInstanceMethod(index: Int) {
      segmentedControlIndex = index
    }
}

但是,我无法定义对非类类型的弱引用。我能做什么?这样做是否合法?

2 个答案:

答案 0 :(得分:19)

[unowned self]很危险。这样做是为了告诉运行时'假设自己还没有被释放,不用担心检查。'如果self在此期间发布,则您的应用程序将为SEGFAULT。

在这种情况下,{ [weak self] in self?.someInstanceMethod($0) }会中断参考周期,如果no-op被释放,则会变为self

[weak self]始终是安全的,而如果您修改代码的其他区域(例如视图层次结构),[unowned self]可能会引入应用崩溃...

答案 1 :(得分:5)

不应该定义对闭包的弱引用,而应该在闭包中使用"Capture List"

segmentedControl3.indexChangeBlock = { [unowned self] in self.someInstanceMethod($0) }

据我所知,这是避免强参考周期的唯一方法。