Objective c AFN网络崩溃,下载大文件200MB+;

Objective c AFN网络崩溃,下载大文件200MB+;,objective-c,ios,download,zip,afnetworking,Objective C,Ios,Download,Zip,Afnetworking,我在下载250MB以下的文件时没有问题,但是当我尝试下载250MB+拉链时,应用程序突然崩溃,没有任何错误。有时会通过,有时不会。泄漏确认没有膨胀或内存丢失 我现在还注意到,只有在我使用xcode调试时才会发生崩溃。当我运行应用程序并下载较大的文件时,当我没有调试时,没有问题 下载更大的文件时,我是否需要以不同的方式处理AFNetworking类 这是我的密码 NSURL* url=[BFAppGlobals getServerURL:[M.Properties objectForKey:@"z

我在下载250MB以下的文件时没有问题,但是当我尝试下载250MB+拉链时,应用程序突然崩溃,没有任何错误。有时会通过,有时不会。泄漏确认没有膨胀或内存丢失

我现在还注意到,只有在我使用xcode调试时才会发生崩溃。当我运行应用程序并下载较大的文件时,当我没有调试时,没有问题

下载更大的文件时,我是否需要以不同的方式处理AFNetworking类

这是我的密码

NSURL* url=[BFAppGlobals getServerURL:[M.Properties objectForKey:@"zip_path" ]];
NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:3600];


 AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc]  initWithRequest:request] autorelease];

NSString* writePath=[BFAppGlobals getContentResourcePathForFile:strFile];

[delegate onStartDownload:M];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:writePath append:YES];

[operation setDownloadProgressBlock:^(NSInteger bytesRead, NSInteger totalBytesRead, NSInteger totalBytesExpectedToRead) {

    int b=totalBytesRead ;
    int total=totalBytesExpectedToRead;
    float perc=(float)b/(float)total;
    M.progress=perc;
    [((NSObject*)delegate) performSelectorOnMainThread:@selector(onDataReceviedFromRequest:) withObject:M   waitUntilDone:YES];

}];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

     NSDictionary* params=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:writePath,writeDirectory, M, nil] forKeys:[NSArray arrayWithObjects:@"Path",@"Dir",@"Model", nil]];
    [self performSelectorInBackground:@selector(unzipDownloaded:) withObject:params];


} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"fail! %@", [error localizedDescription]);
    [delegate onErrorDownload:M WithError:[error localizedDescription]];
    ActiveModel=nil;
}];

[operation start];



****************************  UPDATE ADDED CRASH LOG ***************************************

    Thread 0 Crashed:
    0   libobjc.A.dylib                 0x37d24fbc objc_msgSend + 16
    1   Foundation                      0x35502508 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 12
    2   CoreFoundation                  0x381aa570 ___CFXNotificationPost_block_invoke_0 + 64
    3   CoreFoundation                  0x381360c8 _CFXNotificationPost + 1400
    4   Foundation                      0x354763f4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 60
    5   Foundation                      0x35477c24 -[NSNotificationCenter postNotificationName:object:] + 24
    6   BFiPad                          0x0006d2fc 0x1000 + 443132
    7   CoreFoundation                  0x3813d224 -[NSObject performSelector:withObject:] + 36
    8   Foundation                      0x35517750 __NSThreadPerformPerform + 344
    9   CoreFoundation                  0x381b2afc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 8
    10  CoreFoundation                  0x381b22c8 __CFRunLoopDoSources0 + 208
    11  CoreFoundation                  0x381b106e __CFRunLoopRun + 646
    12  CoreFoundation                  0x381344d6 CFRunLoopRunSpecific + 294
    13  CoreFoundation                  0x3813439e CFRunLoopRunInMode + 98
    14  GraphicsServices                0x37f0bfc6 GSEventRunModal + 150
    15  UIKit                           0x31cb473c UIApplicationMain + 1084
    16  BFiPad                          0x00003f72 0x1000 + 12146
    17  BFiPad                          0x00003f30 0x1000 + 12080

它看起来不像
操作
属于任何特定的东西,所以不能保证它会留在内存中。尝试使用
NSOperationQueue
(可能是连接到
AFHTTPClient
,这将清除大量代码),或者将其设置为启动上载的控制器中的保留属性。

这似乎只在调试模式下发生。调试模式用完或发布更多解决了此问题

我知道此问题很老,但问题似乎仍然存在,因此我将发布我的解决方案

我也遇到过同样的问题,下载大约250MB后它会崩溃,并且发现这是因为每次下载几个字节时都会调用下载进度块,这意味着它会被调用很多次。每秒钟很多次。因此,当从这里调用委托方法(它可能会做一些事情)时,它可能会变得非常占用内存

我的解决方案是跟踪下载进度,并且仅在发生重大更改时调用委托方法(我决定超过1%):

float totalProgress
是一个实例变量


此修复将内存使用量从崩溃时的280MB左右减少到我的应用程序已经使用的30MB左右。也就是说,在下载过程中没有明显的内存增加(假设您直接下载到文件,而不是内存)。

您是否考虑过将数据分块到较小的包中,并分段下载此大文件?“应用程序只是在未通知的情况下崩溃,没有出现错误”-我想可能是有错误。尝试查看设备控制台,它可能因为使用太多内存而被杀死,并且您可能首先收到内存警告。尝试使用仪器查看内存使用情况。转到xCode管理器并找到您的设备。查找你的应用程序崩溃日志。使用崩溃日志更新您的问题。您是否收到任何内存不足事件?我添加了崩溃日志。哈哈,太大了。而且,我现在注意到只有在我用xcode调试时才会发生崩溃。当我运行应用程序并下载更大的文件时,im没有调试,没有问题好主意,不幸的是保留没有帮助。奇怪的是,崩溃只发生在调试中。很遗憾,崩溃日志中堆栈跟踪的第6行没有符号化。崩溃似乎是由于添加了控制器作为
NSNotification
的观察者,但没有在内存中接收到通知。谢谢。我下载了大约30个文件,每个大约20MB。在调试或运行仪器时,如果使用很少的内存,应用程序将崩溃。几天来我一直在努力解决这个问题。投你一票!,我不知道你为什么被否决,因为这是你自己问题的解决方案…我的应用程序在调试中使用了60到200个月。切换到释放使其稳定在40毫米左右。。。我在调试这个时掉了一半头发,另一半非常感谢!使用下载管理器()下载230MB后,我收到内存警告。文件大小约为250MB。请帮帮我
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    float progress = ((float)totalBytesRead) / totalBytesExpectedToRead;
    if ((progress - totalProgress) > 0.01) {
        totalProgress = progress;
        [delegate updateProgress:progress];
    }
}];