如果我在闭包上声明 [weak self]
并在 UIView.animateWithDuration
中将 self
引用为 self?
> 应用会崩溃:
someFunc() { [weak self] (success) -> Void in
UIView.animateWithDuration(0.25) {
self?.someView.alpha = 1;
}
}
使用消息发送到释放的实例
但如果我有选择地提前解包 self 它不会
someFunc() { [weak self] (success) -> Void in
if let weakself = self {
UIView.animateWithDuration(0.25) {
weakself.someView.alpha = 1;
}
}
}
为什么会这样,我认为我引用弱 self 的方式并不重要,因为它应该“只是”有选择地正确展开 self?
。对于上下文,这是在 UICellView
中完成的,当我离开 UICollectionViewController
编辑:向苹果提交了一个错误:#23492648
最佳答案
我认为这里的问题是 self
是特殊的。您已将对 self
的引用弱传递到匿名函数中以防止保留循环,但在这个故事中并没有真正的 Optional 包装 self
。因此,语法糖 self?.someView.alpha = 1
— 请记住,它 只是语法糖 — 不起作用。
可能Apple会认为这是一个bug;或者可能不是。但无论哪种方式,解决方案都是按照您在第二个示例中所做的那样公式化地进行:明确地进行弱-强舞蹈。
关于swift - 引用 [weak self] 作为自己? animateWithDuration 内部导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642575/