我有一个快速的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;
答案 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)
}
(我稍微更新了你的代码,以便更简洁并使用尾随闭包语法)