当前位置: 首页 > 面试题库 >

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

苏华藏
2023-03-14
问题内容

尝试将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]。我强烈建议您查看附件中有关捕获含义的链接。

有关更多信息,请参阅斯坦福课程的这一刻。

正确的代码

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


 类似资料:
  • 问题内容: 我有一个由其他人创建的项目,其中包含成千上万个类文件,并且为每个对其类的引用都显式键入了包名。看起来代码是反向工程的。Java是否有一个很好的工具来重构代码,以便从类引用中删除显式键入的包前缀,并将其移入import语句。 先感谢您。 编辑: 我认为一个例子会有所帮助。我想把进口放在最前面,我不在乎有多少进口。 想象上面的代码,但绝对可以在数千个类文件中的成千上万行代码中的任何地方。我

  • 我在我的应用程序中保存了和的一个实例,每次我想执行一些操作时,我都会调用。 我想知道我是否需要显式关闭连接,就像JDBC中的一样。 要强调的是,我只有一个实例。我的问题不是关于关闭,而是关闭我相信它在调用时打开的连接。

  • 闭包本身是相当灵活的,可以实现所需功能来让闭包运行而不用类型标注(原文:Closures are inherently flexible and will do what the functionality requires to make the closure work without annotation)。这允许变量捕获灵活地适应使用 情况,有时是移动(moving)有时是借用(borro

  • 本文向大家介绍使用jQuery获取data-的自定义属性,包括了使用jQuery获取data-的自定义属性的使用技巧和注意事项,需要的朋友参考一下 废话少说,先上代码 通过jQuery制作组件,可以轻松获取到我们data-的自定义属性,也可以给data-属性来赋值。 获取: 赋值:

  • 问题内容: 我希望能够用元数据注释我的类型和方法,并在运行时读取它们。 语言参考说明了如何声明属性用法,但实际上可以声明自己的属性吗? 阅读将需要某种反射机制,我根本无法在参考文献中找到这种反射机制,因此问题的第二部分可能是- 是否可能反射。如果这些功能在Swift中不可用,是否可以用Objective-C代码完成(但在Swift实例和类型上)? 相对不相关的注释:关于将什么建模为属性以及将哪些内

  • 问题内容: 我正在使用Firebase观察事件,然后在完成处理程序中设置图像 但是我收到此错误 闭包不能隐式捕获变异的自身参数 我不确定这个错误是什么,寻找解决方案并没有帮助 问题答案: 短版 拥有您的调用的类型很可能是值类型(a ?),在这种情况下,变异上下文可能不会在闭包中显式捕获。 一种简单的解决方案是将您的拥有类型更新为一次引用()。 较长的版本 Firebase的方法声明如下 所述封闭件