问题描述
在回答这个问题之前,您必须知道什么是存储周期。请参阅根据Apple的文档解决类实例之间的强引用循环
现在您知道什么是内存周期:
该错误是Swift编译器告诉您
“嘿,NSURLSession 关闭 正在尝试 webviewHTML 在堆中,因此 ==>创建了一个内存循环,我认为克拉克先生不想在这里。想像一下,如果我们发出一个需要花费很长时间的请求,然后用户进行导航离开这个页面。它不会离开堆。我只是告诉 你,但是,克拉克先生必须为自身创建一个弱引用,并 在闭包中 使用它。”
我们使用创建(即捕获) 弱 引用[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();
}
解决方法
尝试将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();
}