Swift中的块引用

时间:2015-03-27 01:31:50

标签: swift closures

我有一个快速的NSURLConnection块。

NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    self.updateDataToPlace(jsonResult)                  
})

Question:如上所述使用self.updateDataToPlace(jsonResult)是否安全?

在Objective-C中,我通常会对这样的事情做一个弱的自我引用。

__weak typeof(self) weakSelf = self;

2 个答案:

答案 0 :(得分:2)

之前(回复:但在{你想要一个捕获列表。

之后

对于你在ObjC中使用的确切内容

[weak self]

请注意,如果你变量变弱,那么dealloc的速度会慢一些(加上所有比较常见的陷阱)。

您也可以尝试

[unowned self]

这可能会更快,但只有在你知道该块能够超过该对象时才使用它,否则你会得到一团糟进行调试。

有关详细信息,请查看capture list on Apple's documentation

答案 1 :(得分:1)

在这种情况下,self没有对块的引用,因此您不需要使self弱。但如果你这样做,你会使用捕获列表作为@Stripes提到的。在这种情况下,self也将成为可选项。

这样的事情:

NSURLConnection.sendAsynchronousRequest(request1, queue: nil) { [weak self] response, data, error in
    var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as NSDictionary
    self?.updateDataToPlace(jsonResult)
}

(我稍微更新了你的代码,以便更简洁并使用尾随闭包语法)