【发布时间】:2015-12-28 12:10:16
【问题描述】:
我的代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *theURLString = @"http://website.com/musicFile";
NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURLString]];
}
没有什么特别的。我什至没有使用后台线程。
这是我在 iOS 8.x 上得到的行为(以及我期望得到的行为):
这样,NSData 被完全释放,所有占用的内存都回来了。
然而,iOS 9.x 让我大吃一惊:
我的问题是:
在 iOS 9.x 中,大约 100 MB 的空间被白白浪费掉了。我怎样才能让他们回来?有什么解决方法吗?
iOS 8.x 最大占用 136.2 MB,而 iOS 9.x 最大占用 225.9 MB。为什么会这样?
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];
如您所见,仍有 30 MB 丢失。
更新 #2:
上述测试是使用 Xcode 模拟器完成的。
不过,我也决定在实际的 iOS 9.2 iPhone 4S 上进行测试(由 @Sohil R. Memon 推荐)。
'NSData dataWithContentsOfURL:'的结果如下:
使用'NSURLSession dataTaskWithURL:completionHandler:'的结果如下:
看起来 'NSData dataWithContentsOfURL:' 在实际设备上可以完美运行,而 'NSURLSession dataTaskWithURL:completionHandler:' -- 不能。
但是,有谁知道在实际设备和 Xcode 模拟器上显示相同信息的解决方案?
【问题讨论】:
-
请尝试在实际设备上测试并将屏幕截图粘贴到此处!
-
请多次尝试下载以查看是否堆叠。如果它是恒定的,那么这个“泄漏”可能是一个网络缓冲区——它被缓存了,因此不是泄漏。
-
@CouchDeveloper 上述所有方法均已测试 5-10 次。
标签: ios objective-c xcode memory nsdata