swift 闭包 return 内的自我引用 无时间

self refrence inside swift closure return nil some time

我在 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)
        }

我可以通过在创建强实例时创建强实例来解决这个问题,在我的例子中,这个弱变量使自身变为 nil。感谢大家为我的查询提供建议。