将[弱自我]称为自我?在animateWithDuration内导致崩溃

Shi*_*zam 9 memory-management optional swift

如果我宣布[weak self]一个封闭和参考selfself?内部UIView.animateWithDuration应用程序会崩溃:

someFunc() { [weak self] (success) -> Void in
    UIView.animateWithDuration(0.25) {
        self?.someView.alpha = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

用一个 message sent to deallocated instance

但如果我提前打开自己,那就不会

someFunc() { [weak self] (success) -> Void in
    if let weakself = self {
        UIView.animateWithDuration(0.25) {
            weakself.someView.alpha = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我认为我引用弱自我的方式并不重要,因为它应该"正好"选择性地解开self?.对于上下文,这是在UICellView我离开时释放的UICollectionViewController

编辑:提交苹果的错误:#23492648

mat*_*att 3

我认为这里的问题很self特别。您已将对weakly 的引用传递self到匿名函数中以防止保留循环,但在这个故事中并没有真正的Optional 包装self。因此,语法糖self?.someView.alpha = 1\xe2\x80\x94 并记住,它语法糖 \xe2\x80\x94 不起作用。

\n\n

苹果可能会将此视为一个错误;或者可能不是。但无论哪种方式,解决方案都是按照公式化地执行第二个示例中所做的操作:明确地进行弱强舞蹈进行弱强舞蹈。

\n