需要澄清块和关闭。
块如何保留对象?或者为什么我们只需要使用弱内部块?如果我们不遵循这个会怎么样?或者请在块上给出一些清晰度。
以下一个操作系统关闭。
我写了一些像这样的代码。 favouriteButton
是自我的财产。
favouriteButton.hidden = false
dispatch_async(dispatch_get_main_queue(), {
self._collectionView.reloadData()
})
它没有给出任何错误。所以我想在主线程中做UI。所以我移动了代码以禁用隐藏的内部块,如下所示。
dispatch_async(dispatch_get_main_queue(), {
favouriteButton.hidden = false
self._collectionView.reloadData()
})
显示错误,如
在闭包中引用属性'favouriteButton'需要显式 '自我'
dispatch_async(dispatch_get_main_queue(), {
self.favouriteButton.hidden = false
self._collectionView.reloadData()
})
任何人都可以解释如何有效地使用闭包/阻止。
答案 0 :(得分:4)
在Swift(和Objective-C)中,一个块是一个闭包。术语闭包是指可单独执行的代码块,用于捕获封闭范围中变量的值。对于Swift,封闭范围通常是一个函数,只捕获块中使用的变量。
您需要在self.
前面添加类级别引用(属性和函数调用)的原因是明确捕获self
。这样做可以指定捕获self
(或任何其他对象引用)的方式:强(默认)或弱。
在块中保留对象(保持强引用)时要小心两个原因。
最常见的问题是创建保留周期。这是块保留对对象的强引用的位置,而对象又强烈引用该块。在明确地断开其中一个引用之前,块和对象都不会被释放。 (释放块只会清除捕获的变量。可执行代码仍然存在。)
对块内对象的强引用可以使对象保持活动时间长于预期。例如,如果一个块保持对从导航堆栈弹出的视图控制器的引用,则您可能不希望该块在执行时对视图控制器起作用。通过捕获视图控制器的弱引用可以避免这种情况。这允许视图控制器在弹出时被解除分配,并且该块变为无操作。