NSInvalidArgumentException:*** - [NSConcreteMutableData initWithCapacity:]:荒谬容量:3794795864,最大大小:2147483648字节

时间:2016-03-15 02:40:49

标签: ios nsmutabledata

我的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相关。

1 个答案:

答案 0 :(得分:1)

  

我的iOS应用正在下载一个非常大的zip文件

保留NSMutableData以保留它的事实表明此处的计划不是下载该文件,而是将其视为数据来保存整个时间在记忆。这是非常错误的,尤其是因为你的应用程序可能会崩溃,如果它试图在内存中保存这么大的对象。真正的下载会将下载到磁盘,几乎不需要留出任何内存。