阻止/关闭理解

时间:2016-05-18 12:09:23

标签: ios swift closures block

需要澄清块和关闭。

  1. 块如何保留对象?或者为什么我们只需要使用弱内部块?如果我们不遵循这个会怎么样?或者请在块上给出一些清晰度。

  2. 以下一个操作系统关闭。

  3. 我写了一些像这样的代码。 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()
    })
    

    任何人都可以解释如何有效地使用闭包/阻止。

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

1 个答案:

答案 0 :(得分:4)

在Swift(和Objective-C)中,一个块是一个闭包。术语闭包是指可单独执行的代码块,用于捕获封闭范围中变量的值。对于Swift,封闭范围通常是一个函数,只捕获块中使用的变量。

您需要在self.前面添加类级别引用(属性和函数调用)的原因是明确捕获self。这样做可以指定捕获self(或任何其他对象引用)的方式:强(默认)或弱。

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

  1. 最常见的问题是创建保留周期。这是块保留对对象的强引用的位置,而对象又强烈引用该块。在明确地断开其中一个引用之前,块和对象都不会被释放。 (释放块只会清除捕获的变量。可执行代码仍然存在。)

  2. 对块内对象的强引用可以使对象保持活动时间长于预期。例如,如果一个块保持对从导航堆栈弹出的视图控制器的引用,则您可能不希望该块在执行时对视图控制器起作用。通过捕获视图控制器的弱引用可以避免这种情况。这允许视图控制器在弹出时被解除分配,并且该块变为无操作。