0

嗨,伙计们,

我有这些源代码

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 ...] 是什么意思,为什么要使用它?(我认为避免保留循环。)谢谢你们!

4

2 回答 2

0

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

于 2014-12-12T11:12:36.070 回答
0

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

这相当于 Objective-C:

UIButton * __weak button = ...
于 2014-12-12T10:41:09.450 回答