小编典典

引用闭包中的属性需要显式的“自我”。使捕获语义明确

swift

尝试将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();
}

阅读 209

收藏
2020-07-07

共1个答案

小编典典

在回答这个问题之前,您必须知道什么是存储周期。请参阅根据Apple的文档解决类实例之间的强引用循环


现在您知道什么是内存周期:

该错误是Swift编译器告诉您

“嘿,NSURLSession 关闭 正在尝试 webviewHTML 保留 在堆中,因此 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();
}

2020-07-07