尝试将HTML从Web服务加载到Webview中时,出现以下错误:
在闭包中引用属性“ webviewHTML”需要显式的“自我”。使捕获语义明确
这是什么意思,如何将HTML字符串加载到Web视图中?
func post(url: String, params: String) { let url = NSURL(string: url) let params = String(params); let request = NSMutableURLRequest(URL: url!); request.HTTPMethod = "POST" request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in if error != nil { print("error=\(error)") return } var responseString : NSString!; responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) webviewHTML.loadHTMLString(String(responseString), baseURL: nil) } task.resume(); }
在回答这个问题之前,您必须知道什么是存储周期。请参阅根据Apple的文档解决类实例之间的强引用循环
现在您知道什么是内存周期:
该错误是Swift编译器告诉您
“嘿,NSURLSession 关闭 正在尝试 将 webviewHTML 保留 在堆中,因此 self ==>创建了一个内存循环,我认为克拉克先生不想在这里。想像一下,如果我们发出一个需要花费很长时间的请求,然后用户进行导航离开这个页面。它不会离开堆。我只是 告诉 你,但是,克拉克先生必须为自身创建一个弱引用,并 在闭包中 使用它。”
我们使用创建(即捕获) 弱 引用[weak self]。我强烈建议您查看附件中有关捕获含义的链接。
[weak self]
有关更多信息,请参阅斯坦福课程的这一刻。
正确的代码
func post(url: String, params: String) { let url = NSURL(string: url) let params = String(params); let request = NSMutableURLRequest(URL: url!); request.HTTPMethod = "POST" request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { [weak weakSelf self] data, response, error in if error != nil { print("error=\(error)") return } var responseString : NSString!; responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) weakSelf?.webviewHTML.loadHTMLString(String(responseString), baseURL: nil) // USED `weakSelf?` INSTEAD OF `self` } task.resume(); }