iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView

Posted

技术标签:

【中文标题】iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView【英文标题】:iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView 【发布时间】:2010-09-21 18:11:18 【问题描述】:

请帮忙!已经盯着这个看了12个小时;上网查了也没找到解决办法。

在我的应用程序中,我在不同的页面/控制器中使用了 2 个 UIView 控件:

UIImageView(通过检索数据 NSData dataWithContentsOfUrl) UIWeb 视图

为了隔离我的代码并使其更易于解释,我创建了一个基于视图的新项目,名为“MyTestApplication”

1 - 我在委托函数中添加了一个简单的 NSData dataWithContentsOfUrl。

NSData *imageData = [NSData dataWithContentsOfURL:
  [NSURL URLWithString:@"http://www.google.com/intl/en_ALL/images/logo.gif"]];

(这里没有发布,因为都是使用便利功能)

alt text http://img.skitch.com/20081110-j5tn5n7ixph95ys4rpchibaw5p.preview.jpg

View Image

2 - 运行它以验证没有泄漏(如预期)

alt text http://img.skitch.com/20081110-fy2qrkgy47hm4fe2f1aakd4muw.preview.jpg

View Image

3 - 打开 ViewController.xib 并从库中添加一个 UIWebView(无需连接)

alt text http://img.skitch.com/20081110-d63c3yh1a1kqiciy73q8uyd68j.preview.jpg

View Image

4 - 运行它以验证是否存在泄漏! (为什么???)

alt text http://img.skitch.com/20081110-qtxcfwntbcc3csabda3r6nfjg6.preview.jpg

View Image

我做错了什么?请帮忙!

如果我使用 UIWebView,为什么 NSData 会导致内存泄漏?我只是不明白。 谢谢。

【问题讨论】:

【参考方案1】:

我认为这是正在发生的事情:

加载 ViewController.xib 时,会分配并初始化 UIWebView 的实例。由于您没有将其连接到任何地方,因此它不会被释放。我认为您需要将其连接起来并在您的支持视图控制器的 dealloc 函数中释放它。我记得必须手动释放我在 xib 文件中创建的每个对象。

【讨论】:

不是真的。 xib 中的内容由视图控制器的initWithNib 保留,并在视图控制器被释放时释放。在任何情况下,如果这是真的,它也会显示 web 视图和 NSData 泄露,但事实并非如此【参考方案2】:

您是否在模拟器上运行泄漏?如果是这样,请注意编码器。模拟器会泄漏内存,而 iPhone 硬件不会。没有模拟器能完美匹配您的代码在设备上的确切行为。

我也会在设备上进行测试。我只是在 UITableViewController 的类似问题上做了同样的事情,它在 Sim 中泄漏但在手机上没有泄漏。

【讨论】:

【参考方案3】:

iPhone 模拟器中 NSData 的 dataWithContentsOfURL: 泄漏也有问题。我发现当我使用其他便捷方法 (dataWithContentsOfURL:options:error:) 时,不会出现内存泄漏。

我的代码看起来像这样:

NSURL *url = [NSURL URLWithString:urlString];
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:url
                                     options:0
                                       error:&error];

Link to documentation

【讨论】:

在 OS 3.1.2(在 sim 和 3GS 上)中看到了同样的泄漏。你的建议解决了!奇怪的是 NSDataReadingOptions 显然不在 iPhone SDK 中?【参考方案4】:

[NSData dataWithContentsOfURL:url options:0 error:&error]ios8 上没有帮助我。

但以下工作正常:

NSURLRequest* request = [NSURLRequest requestWithURL:imageURL];
NSData* imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];

生产代码还需要响应和错误参数。

【讨论】:

以上是关于iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

iphone内存泄漏教程

iPhone/iPad 应用程序内存泄漏

iPhone 内存泄漏与商店套件

内存泄漏 - iPhone

iPhone - NSKeyedUnarchiver 内存泄漏

iPhone 内存泄漏工具