【问题标题】:NSInvalidArgumentException: *** -[NSConcreteMutableData initWithCapacity:]: absurd capacity: 3794795864, maximum size: 2147483648 bytesNSInvalidArgumentException:*** -[NSConcreteMutableData initWithCapacity:]:荒谬容量:3794795864,最大大小:2147483648 字节
【发布时间】:2016-03-15 02:40:49
【问题描述】:

我的 iOS 应用正在使用 AFNetworking 下载一个非常大的 zip 文件(3.79GB)。我的应用程序还使用了 Flipboard 的 FLEX library 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完全无关。

【问题讨论】:

    标签: ios nsmutabledata


    【解决方案1】:

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

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

    【讨论】:

    • 我可以告诉你如何使用 NSURLSession 做到这一点,但我不了解 AFNetworking,所以我让你弄清楚如何下载到磁盘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多