【发布时间】:2014-08-02 09:34:30
【问题描述】:
我正在尝试编写一个简单的闭包作为完成处理程序,并在闭包内设置文本框的文本值:
class ViewController: UIViewController {
@IBOutlet var textArea : UITextView
let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session:NSURLSession?
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
session = NSURLSession(configuration: sessionConfig)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func btnSendRequestTapped(sender : AnyObject) {
let url:NSURL = NSURL(string: "https://www.google.com")
let sessionTask:NSURLSessionTask =
session!.dataTaskWithURL(url, completionHandler: {
[unowned self]
(data:NSData!,response:NSURLResponse!,error:NSError!) -> Void in
let st:String = NSString(data: data,encoding: NSUTF8StringEncoding)
println("\(st)")
NSOperationQueue.mainQueue().addOperationWithBlock({
() -> Void in
self.textArea!.text = st
})
})
sessionTask.resume()
}
}
但是在我定义了 [unowned self] 的那一行,我得到了EXC_BREAKPOINT(code=EXC_I386_BPT,subcode=0x0),它显示了一些汇编代码,如下所示:
libswift_stdlib_core.dylib`_swift_abortRetainUnowned:
0x1001bb980: pushq %rbp
0x1001bb981: movq %rsp, %rbp
0x1001bb984: leaq 0x176a7(%rip), %rax ; "attempted to retain deallocated object"
0x1001bb98b: movq %rax, 0x792ce(%rip) ; gCRAnnotations + 8
0x1001bb992: int3
0x1001bb993: nopw %cs:(%rax,%rax)
根据文档,我不确定我在这里做错了什么。我已将问题更新为包含整个班级。 我还更新了问题以更新主线程上 TextView 的文本属性
【问题讨论】:
-
@LordZsolt:这正是
[unowned self]的用途。 -
您的对象在完成处理程序被调用之前被释放。您需要在某处保留对它的引用。
-
我最近讨论了一个类似的问题stackoverflow.com/questions/24137090/… 它似乎在框架中存在一些错误,因为控制器显然可以在仍然引用它们时被释放(例如,当它们仍在屏幕上时)。
-
顺便说一句,这里不需要
[unowned self],因为无论如何都不会有保留周期——控制器不会保留闭包。
标签: swift