我的iOS应用正在使用AFNetworking下载一个非常大的zip文件(3.79GB)。我的应用程序还使用Flipboard的FLEX库2.2来监控网络流量。用户报告,一旦应用程序触发下载请求,应用程序就会崩溃并显示以下堆栈跟踪:
Crashed Thread
0 CoreFoundation 0x22c6010b __exceptionPreprocess + 124
1 libobjc.A.dylib 0x22406e17 objc_exception_throw + 36
2 CoreFoundation 0x22c60051 +[NSException raise:format:] + 110
3 Foundation 0x233bed7d -[NSConcreteMutableData initWithCapacity:] + 106
4 previewer 0x001e9c3d __86-[FLEXNetworkObserver(NSURLConnectionHelpers) connection:didReceiveResponse:delegate:]_block_invoke (FLEXNetworkObserver.m:946)
5 libdispatch.dylib 0x227d9b5b _dispatch_call_block_and_release + 8
6 libdispatch.dylib 0x227e675b _dispatch_queue_drain$VARIANT$mp + 1756
7 libdispatch.dylib 0x227e5d99 _dispatch_queue_invoke$VARIANT$mp + 282
8 libdispatch.dylib 0x227e8495 _dispatch_root_queue_drain + 394
9 libdispatch.dylib 0x227e8305 _dispatch_worker_thread3 + 94
10 libsystem_pthread.dylib 0x22997b29 _pthread_wqthread + 1022
11 libsystem_pthread.dylib 0x22997718 start_wqthread + 6
崩溃原因:
NSInvalidArgumentException:*** - [NSConcreteMutableData initWithCapacity:]:荒谬容量:3794795864,最大大小: 2147483648字节
它出现在FLEXNetworkObserver
的以下行:
if (response.expectedContentLength < 0) {
dataAccumulator = [[NSMutableData alloc] init];
} else {
dataAccumulator = [[NSMutableData alloc] initWithCapacity:(NSUInteger)response.expectedContentLength];
}
他正在使用iPad 3,他说他无法使用他的新款iPad mini 3重现这个问题。我是否知道这是否是由于旧款iPad型号(在这种情况下是iPad 3)的32位限制造成的?导致坠机的原因是什么?
我将禁用FLEX网络调试,以解决此问题。
更新
我可以在[[FLEXManager sharedManager] setNetworkDebuggingEnabled:NO];
禁用FLEX后成功下载该文件,因此根本无法与AFNetworking相关。
答案 0 :(得分:1)
我的iOS应用正在下载一个非常大的zip文件
保留NSMutableData以保留它的事实表明此处的计划不是下载该文件,而是将其视为数据来保存整个时间在记忆。这是非常错误的,尤其是因为你的应用程序可能会崩溃,如果它试图在内存中保存这么大的对象。真正的下载会将下载到磁盘,几乎不需要留出任何内存。