iPhone - 内存泄漏 - NSData dataWithContentsOfUrl 和 UIWebView

5
请帮忙!我已经盯着这个问题12个小时了,上网搜索也找不到解决方案。
我在我的应用程序中使用了2个分别位于不同页面/控制器的UIView控件:
- UIImageView(通过NSData dataWithContentsOfUrl检索数据) - UIWebView
为了隔离我的代码并使其更易于解释,我创建了一个名为"MyTestApplication"的新视图项目。
1- 我在委托函数中添加了一个简单的NSData dataWithContentsOfUrl。
NSData *imageData = [NSData dataWithContentsOfURL:
  [NSURL URLWithString:@"http://www.google.com/intl/en_ALL/images/logo.gif"]];

这里没有需要发布的内容,因为所有操作都使用了方便函数。

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

查看图片

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

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

查看图片

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

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

查看图片

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

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

查看图片

我做错了什么?请帮忙!

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

4个回答

5

我在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


在模拟器和3GS上的OS 3.1.2中也发现了同样的泄漏。您的建议解决了这个问题!奇怪的是,NSDataReadingOptions显然不在iPhone SDK中? - Jason

4

我认为发生的情况是:

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


不是真的。在xib中的东西由视图控制器的initWithNib保留,并在视图控制器被释放时释放。无论如何,如果这是真的,它也会显示WebView和NSData泄漏,但事实并非如此。 - user102008

1

你是否在模拟器上运行Leaks?如果是,注意编码。模拟器会泄漏内存,而iPhone硬件不会。任何模拟器都无法完全匹配代码在设备上的确切行为。

我也会在设备上进行测试。我刚刚在一个类似的UITableViewController问题上做了同样的事情,它在Simulator上泄漏但在手机上却没有。


0

[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];

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接