2012-06-05 40 views
3

我有一个嵌入式WebView可可应用程序。我使用下面的代码将窗口控制器设置为可通过JavaScript访问。windowScriptObject中的WebView内存泄漏setValue:self forKey:?

问题是,调用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]; 
} 

回答

2

马克,

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

Andrew

+1

这对我来说是不够的。调用[self.webView关闭]解决了泄漏问题。 –

+1

[_webView关闭]是要走的路。不要setValue:nil forKey:@“...”,因为如果webview仍在加载,它可能会崩溃。 -close方法被记录并停止调用委托方法,停止任何加载和(未记录但打开的)调用WebCore :: ScriptController :: clearScriptObjects()),它们将正确删除scriptObject并将其释放。 – Altimac