gpt4 book ai didi

ios - block /闭包理解

转载 作者:行者123 更新时间:2023-11-28 10:18:59 26 4
gpt4 key购买 nike

需要澄清 block 和关闭。

  1. block 如何保留对象?或者为什么我们只需要使用 weak inside block ?如果我们不遵循这个会发生什么?或者请对 block 进行一些说明。

  2. 下面一个用于关闭的操作系统。

我写过这样的代码。 favouriteButton 是 self 的一个属性。

favouriteButton.hidden = false
dispatch_async(dispatch_get_main_queue(), {
self._collectionView.reloadData()
})

它没有给出任何错误。所以我想到了在主线程中做UI。所以我移动了代码以禁用隐藏在 block 内,如下所示。

dispatch_async(dispatch_get_main_queue(), {
favouriteButton.hidden = false
self._collectionView.reloadData()
})

它显示了类似

的错误

reference to property 'favouriteButton' in closure requires explicit 'self'

dispatch_async(dispatch_get_main_queue(), {
self.favouriteButton.hidden = false
self._collectionView.reloadData()
})

谁能解释一下如何有效地使用闭包/ block 。

  1. block 和闭包的工作方式是否相同?

最佳答案

在 Swift(和 Objective-C)中,一个 block 就是一个闭包。术语闭包 指的是一个可单独执行的代码块,它捕获封闭范围内的变量值。在 Swift 的情况下,封闭范围通常是一个函数,并且只捕获 block 内使用的变量。

您需要在类级引用(属性和函数调用)前加上 self. 的原因是要显式捕获 self。这样做允许您指定如何捕获 self(或任何其他对象引用):强(默认)或弱。

在 block 中保留对象(保留强引用)时要小心有两个原因。

  1. 最常见的问题是创建一个保留循环。这是 block 保留对对象的强引用的地方,对象又对 block 具有强引用。在其中一个引用被明确破坏之前, block 和对象都不会被释放。 (释放一个 block 只是清除捕获的变量。可执行代码仍然存在。)

  2. 在 block 中对对象的强引用可以使对象的存活时间比预期的长。例如,如果一个 block 保留对从导航堆栈中弹出的 View Controller 的引用,您可能不希望该 block 在执行时作用于 View Controller 。这可以通过捕获对 View Controller 的弱引用来避免。这允许 View Controller 在弹出时被释放,并且该 block 变为空操作。

关于ios - block /闭包理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com