【问题标题】:completionHandler and [weak button]completionHandler 和 [弱按钮]
【发布时间】:2014-12-12 10:36:45
【问题描述】:

大家好,

我有这些源代码

let downloadTask = session.downloadTaskWithURL(url,
completionHandler: {
  [weak button] url, response, error in
    if error == nil && url != nil {
      if let data = NSData(contentsOfURL: url) {
        if let image = UIImage(data: data) {
          dispatch_async(dispatch_get_main_queue()) {
            if let button = button {
              button.setImage(image, forState: .Normal)
            }
          }
        }
      }

此代码块尝试将来自 url 的图像放入按钮元素中。 有人可以帮我理解为什么在这个源代码块中,在completionHandler 参数列表中它使用[弱按钮]? [weak ...] 是什么意思,为什么要使用它? (我认为避免保留循环。) 谢谢各位!

【问题讨论】:

标签: ios swift completionhandler


【解决方案1】:

这不是一个参数,它只是声明函数中对按钮的每次调用都是对按钮的弱引用。 这是在闭包内使用对对象的弱引用的快捷方式。

这相当于Objective-C:

UIButton * __weak button = ...

【讨论】:

    【解决方案2】:

    [weak button] 表示按钮参数是可选的,执行完成处理程序时可以为nil。因此,完成块中可能不存在该按钮。您也可以使用[unowned button],但前提是您确定该按钮存在,否则它将崩溃。第三个选项是在按钮之前不要使用neithor weak 或unowned,这意味着在执行闭包之前,它将保持对按钮的强引用并且不会让它被deinited。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2023-04-07
      相关资源
      最近更新 更多