我在尝试恢复分配给 a 的内存时遇到了一些真正的麻烦UIWebView
在我的应用程序中。我本质上是创造并呈现UIWebView
暂时为用户单独ViewController
,然后删除所有引用并弹出ViewController
从堆栈中。尽管做了所有这些,分配的内存永远不会返回,并且我被额外的 10 Mb 内存卡住了每一次我接着说ViewController
again.
让我们看看我是如何处理这个问题的UIWebView
无论如何。
好吧,对于初学者来说,我的头文件中有一个对它的本地引用,请在此处显示
#pragma mark UIWebView Properties
/// WebView for loading URL resources
@property (nonatomic, weak)UIWebView *webView;
请注意,这不是一个IBOutlet
,我正在创建这个UIWebView
以编程方式在以下方法中触发ViewDidAppear
.
-(void)presentYoutubeVideoWithID:(NSString *)videoID {
/* Setup UIWebView */
UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
/* Set Delegate */
[webView setDelegate:self];
/* Set local property */
[self setWebView:webView];
/* Add view to ViewController */
[self.view addSubview:webView];
/* Set constraints */
// Removed for simplicity
/* Set URL */
NSString *youTubeVideoHTML = @"<!DOCTYPE html> (Removed) </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.view.frame.size.width, self.view.frame.size.height, videoID];
[webView loadHTMLString:html baseURL:[[NSBundle mainBundle]resourceURL]];
/* Setup Notification */
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWhenDoneButtonClick:)
name:UIWindowDidBecomeHiddenNotification
object:nil];
}
最后,我清理并“弹出”UIViewController
:
-(void)handleWhenDoneButtonClick:(NSNotification *)notification {
/* Remove Observer */
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIWindowDidBecomeHiddenNotification object:self.view.window];
/* Remove UIWebView from hierarchy */
[self.webView removeFromSuperview];
/* Remove self from webView delegate */
[self.webView setDelegate:nil];
/* Remove reference because I can */
[self setWebView:nil];
/* Dismiss ViewController */
[self dismissViewControllerAnimated:YES completion:nil];
}
对于一个足够简单的场景,似乎没有什么可以真正删除 UIWebView 占用的内存。正如您在这里看到的,内存使用量永远不会减少:
加载 UIWebView 之前:
Once the UIWebView is Open:
After popping the ViewController and removing references to UIWebView:
据我所知,这里使用的内存量会无限期地持续存在。五分钟后,它仍将分配 34+ Mb。如果我打开ViewController
再次,它会分配更多,一旦我再次弹出,我最终将获得大约 40 Mb 的“基本”使用量。
Leaks:没有被完全劝阻,我最初去寻找漏洞,认为我在某个地方犯了一些错误。然而,虽然我确实发现了一些非常small泄漏,它们似乎完全与UIWebView
.
S.O 的其他案例:我在网上寻找解决方案已经有一段时间了,但我发现的唯一真正相关的线程是去年的一个,如下所示:UIWebView 占用大量内存
它还没有答案,这可能是因为(像与此主题相关的大多数其他问题一样),许多答复提供了通用/冲突的建议。比如建议你使用 ARC(谁不使用?),或者告诉 OP 他们不应该保留强引用(即使他们不这样做,代码也演示了这一点)。最后,一些答案只是声称内存管理一开始就不是问题,因为有足够的内存可供使用,而这些答案也没有帮助。
无论如何,这是我目前面临的问题。感谢您花时间阅读本文(如果您阅读了!)。