swift - 引用 [weak self] 作为自己? animateWithDuration 内部导致崩溃

标签 swift memory-management option-type

如果我在闭包上声明 [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/

相关文章:

c - 在c中使用基于区域的内存管理

java - 如何使用 .map()/.filters() 添加不同类中存在的不同变量

java-8 - 如何将 java.util.Optional<Something> 映射到某物?在 Kotlin

arrays - 从另一个 Array<String> 过滤 Array<String> 的值

ios - 渐变动画——减速和加速

ios - QuartzCore.framework 应该如何在 Swift 中导入?

swift - GCD + Firebase 云存储

linux - 如何避免在物理内存中共享库文本节的多个副本?

c++ - 原始类型动态分配数组的析构函数?

Java:如果存在可选值,则添加到 Guava ImmutableList