在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
}
}
但是,我无法定义对非类类型的弱引用。我能做什么?这样做是否合法?
答案 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) }
据我所知,这是避免强参考周期的唯一方法。