【问题标题】:WebView memory leak in windowScriptObject setValue:self forKey:?windowScriptObject setValue:self forKey: 中的 WebView 内存泄漏?
【发布时间】:2012-06-05 12:20:34
【问题描述】:

我有一个嵌入了 WebView 的 Cocoa 应用程序。我使用下面的代码将窗口控制器设置为可通过 JavaScript 访问。

问题是对setValue:self forKey:@"console" 的调用似乎在ARC 下引入了内存泄漏,从某种意义上说,WebView 和窗口控制器在窗口关闭后永远不会释放。

当我注释掉setValue 行时,WebView 和控制器会在窗口关闭时自动释放。

我试过[self.webView.windowScriptObject removeWebScriptKey:@"console"],但也没有用。

在窗口控制器中添加 JavaScript 对象的代码:

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject
       forFrame:(WebFrame *)frame {

    if (frame != self.webView.mainFrame) return;

    [self.webView.windowScriptObject setValue:self forKey:WELCOME_WINDOW_JS_NAME];
}

【问题讨论】:

    标签: cocoa memory-leaks webview webkit automatic-ref-counting


    【解决方案1】:

    标记,

    您已确定问题代码。缺少的是您在释放窗口时没有将键设置为 nil:setValue: nil forKey: @"console"。这样做,一切都会好起来的。

    安德鲁

    【讨论】:

    • 这对我来说是不够的。调用 [self.webView close] 解决了泄漏问题。
    • [_webView close] 是要走的路。不要 setValue:nil forKey:@"..." 因为如果 webview 仍在加载,它可能会崩溃。 -close 方法已记录并停止调用委托方法,停止任何加载和(未记录但开源)调用 WebCore::ScriptController::clearScriptObjects()) 正确删除 scriptObjects 并释放它。
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多