swift - swift 闭包中的 self 引用在一段时间内返回 nil

标签 swift weak-references completionhandler

我在 swift 中访问闭包内的实例方法,self 引用在某些情况下变为 nil,这导致我的程序崩溃。我尝试使用 [weak self] 进行访问,但是当 selfnil 时,它无法调用实例方法。

[weak self] () -> () in

最佳答案

[weak self] 的全部要点是不创建对 self 的引用(可能是为了避免循环链接和内存泄漏),以便它可以被释放。如果发生这种情况,则 self 将为 nil

你要么不使用 [weak self],要么准备好处理 self 被释放并设置为 nil 的情况

guard let strong = self else { return }

举个例子:

import UIKit
import PlaygroundSupport

class Foo {
    let name : String

    init(name:String) {
        self.name = name

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            print(self!.name)
        }
    }
}

Foo(name:"freddie")

PlaygroundPage.current.needsIndefiniteExecution = true

在这种情况下,您会遇到崩溃,因为在进行异步回调之前释放了 self。

您可以将 asyncAfter 调用更改为:

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            print(self.name)
        }

将保证在回调完成之前不会释放 self。

或者你可以使用类似的东西:

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            guard let strong = self else { print("self released") ; return }
            print(strong.name)
        }

关于swift - swift 闭包中的 self 引用在一段时间内返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147019/

相关文章:

ios - 为什么 completionHandler block 没有响应?

ios - 完成处理程序 swift 3 从函数返回一个变量

java - 弱引用和内存泄漏

ios - 如何将 NavigationItem 添加到以编程方式创建的 UINavigationController

ios - 如何删除所有导航栏后退按钮标题

swift - 如何在swift中获取数组的元素类型

java - WeakReferences、Weakashmaps、softreferences 的用途是什么?

java - Java EE 编程中使用弱引用和软引用的地方

ios - 身份验证服务错误中的完成处理程序

ios - SKScene 如何与其容器 SKView 通信?