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

时间:2015-11-11 01:04:31

标签: swift memory-management optional

如果我在[weak self]内的self上声明self?关闭并引用UIView.animateWithDuration,则应用会崩溃:

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

使用message sent to deallocated instance

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

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

为什么会这样,我认为我引用弱自我的方式无关紧要,因为它应该“只是”正确地解包self?。对于上下文,这是在UICellView中完成的,当我离开UICollectionViewController

时将其解除分配

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

1 个答案:

答案 0 :(得分:3)

我认为这里的问题是self很特别。您已将self的引用弱地传递到匿名函数以防止保留周期,但在此故事中并没有真正的可选包装self。因此,句法糖self?.someView.alpha = 1 - 记住,它 仅仅是语法糖 - 不起作用。

苹果可能会认为这是一个错误;或者可能不是。但无论哪种方式,解决方案都是在公式上完成你在第二个例子中所做的事情:明确地执行弱强舞