Swift中的捕获列表
在进入Capture List之前,让我们谈谈关闭周期。 这是Apple文档中的定义
闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambda。
闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这称为关闭这些常量和变量。 Swift为您处理捕获的所有内存管理。
这是一个关闭的例子
每当我调用increment()
时,闭包都会增加数字的值
由于Closures是引用类型,因此我们可以使用类来模拟Closure,因为Classes也是引用类型。
每当我更改调用该方法时,它都会增加该存储的属性。
现在,这是一个可能导致泄漏的示例。
我将crementNumber方法更改为闭包,并作为存储的属性,输出精确给出了我想要的数字。 但这会导致内存泄漏,闭包是指对象本身,它是指self以增加数字,这将创建一个引用周期:
- 我们有一个对象,并且该对象具有一个存储的属性,该属性引用一个闭包。
- 该闭包指的是
self
(表示增量实例)
让我们添加deinit
方法并检查它是否具有保留周期
块(Curly大括号)结束时, increment()
实例应为释放内存。
捕获列表将帮助我们修复它吗?
通过添加[unowned self]
然后打印出deinit
,这意味着在闭deinit
我们引用self
地方,它都将是无主的,不会再强引用self
,因此不会泄漏。
但是,在使用[unowned self]
时,应谨慎行事。
如果我实例化increment()
,那么我立即用三个调用increment,程序将崩溃,因为当存储的属性返回时,对象(increment实例)可以被释放,其他都没有引用它。
那么如何解决它,让我们将[unowned self]
更改为[weak self]
,这意味着在访问该self的任何地方,我们都将其视为弱属性。
当存储的属性返回时,如果对象被释放,则平均值为nil,则数字将不会增加。 如果self为零,此代码将使其易于处理
就是这样,希望您喜欢这篇文章,感谢您的阅读,下次再见。