gpt4 book ai didi

ios - 'NSData dataWithContentsOfURL :' memory leak iOS 9. x?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:09 24 4
gpt4 key购买 nike

我的代码如下:

- (void)viewDidLoad
{
[super viewDidLoad];
NSString *theURLString = @"http://website.com/musicFile";
NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURLString]];
}

没什么特别的。我什至没有使用后台线程。

这是我在 iOS 8.x 上获得的行为(以及我期望获得的行为):

enter image description here

因此,NSData 被完全释放,所有占用的内存都回来了。

然而,iOS 9.x 让我大吃一惊:

enter image description here

我的问题是:

  1. 大约 100 MB 在 iOS 9.x 中被白白浪费了。我怎样才能让他们回来?有什么解决方法吗?

  2. iOS 8.x 最多占用 136.2 MB,而 iOS 9.x 最多占用 225.9 MB。为什么会这样?

  3. iOS 9.x 发生了什么?

更新#1:

我也尝试过使用 NSURLSession 'dataTaskWithURL:completionHandler:'(感谢@CouchDeveloper)。这减少了泄漏,但没有完全解决问题(这次是 iOS 8.x 和 iOS 9.x)。

我使用了下面的代码:

NSURLSession *theURLSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *theURLSessionDataTask = [theURLSession dataTaskWithURL:[NSURL URLWithString:theURLString]
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
NSLog(@"done");
}];
[theURLSessionDataTask resume];

enter image description here

如您所见,仍有 30 MB 丢失。

更新#2:

以上测试是使用 Xcode 模拟器完成的。

但是,我还决定在实际的 iOS 9.2 iPhone 4S 上进行测试(由@Sohil R. Memon 推荐)。

“NSData dataWithContentsOfURL:”的结果如下:

enter image description here

使用 'NSURLSession dataTaskWithURL:completionHandler:' 的结果如下:

enter image description here

看起来“NSData dataWithContentsOfURL:”在实际设备上完美运行,而“NSURLSession dataTaskWithURL:completionHandler:”则不然。

但是,有谁知道在实际设备和 Xcode 模拟器上显示相同信息的解决方案吗?

最佳答案

Approximately 100 MB are gone for nothing in iOS 9.x. How can I get them back? Are there any workarounds?

出于多种原因,我们应该使用NSURLSession 从网络服务下载数据。因此,这不是解决方法,而是正确的方法。

What is going on in iOS 9.x?

我不知道 - 可能是缓存数据、网络缓冲区或其他一些问题。但这无关紧要 - 您应该使用 NSURLSession 尝试正确的方法。

来自docs :

重要

不要使用这种同步方法来请求基于网络的 URL。对于基于网络的 URL,此方法在慢速网络上会阻塞当前线程数十秒,导致用户体验不佳,在 iOS 中,可能会导致您的应用终止。

相反,对于非文件 URL,请考虑使用 NSURLSession 类的 dataTaskWithURL:completionHandler: 方法。参见 URL Session Programming Guide了解详情。

编辑:

这些“原因”是:

  • NSURLSession 专门用于加载远程资源。

  • NSURLSession 方法是异步,这对于仅在可感知的持续时间后完成的方法至关重要(它不会阻塞调用线程)。

  • session 可以通过默认方法或自定义委托(delegate)处理身份验证。

  • session 任务可以取消。

关于ios - 'NSData dataWithContentsOfURL :' memory leak iOS 9. x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com