快速关闭内部的自我反思在一段时间内没有回归

时间:2017-03-31 18:04:08

标签: swift weak-references completionhandler

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

[weak self] () -> () in

2 个答案:

答案 0 :(得分:3)

[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)
        }

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

或者您可以使用以下内容:

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

答案 1 :(得分:0)

我能够通过在创建它时创建强大的实例来解决这个问题,在我的情况下,这个弱变量对自己来说是零。感谢大家为我的查询提供建议。