快速捕获功能列表

时间:2018-10-08 10:16:15

标签: swift function closures automatic-ref-counting

使用闭包时,我们可以通过使用weakunowned作为捕获列表来避免 strong参考周期

我知道该函数也是一个命名的闭包。所以我想函数也可以从上下文中捕获值。

如何避免使用 strong参考周期

下面的代码

class Person {
    var name: String?

    func printInfo() {
        print(self.name ?? "nil")
    }

    deinit {
         print("\(self.name ?? "") is deinitialized.")
    }
}

var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo
p1 = nil

不打印任何消息

...
p1 = nil
printFunction = nil

打印Person1 is deinitialized.

有人对此案有解决方案吗?在关闭的情况下,我们有weakunowned个捕获列表。

1 个答案:

答案 0 :(得分:1)

您可以使用闭包代替该方法。

class Person {
    var name: String?

    lazy var printInfo = { [unowned self] in
        print(self.name ?? "nil")
    }

    deinit {
        print("\(self.name ?? "") is deinitialized.")
    }
}


var p1: Person? = Person()
p1?.name = "Person1"

var printFunction = p1?.printInfo

p1 = nil

此代码打印-Person1 is deinitialized.

lazy确保对属性的访问恰好在实例初始化之后进行,因此self肯定存在,我们可以在闭包主体中使用self。 如果您需要更多有关ARC的信息,请阅读-https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html