使用AFNetworking下载多个文件时接收内存警告

时间:2013-10-02 14:03:04

标签: ios memory-management afnetworking-2

我正在从UIGridViewCells下载电影文件。我的代码是:

NSMutableURLRequest* rq = [[APIClient sharedClient] requestWithMethod:@"GET" path:[[self item] downloadUrl] parameters:nil];
    [rq setTimeoutInterval:5000];
    _downloadOperation = [[AFHTTPRequestOperation alloc] initWithRequest:rq] ;
    _downloadOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:[[self item] localUrl] append:NO];
    __weak typeof(self) weakSelf = self;
    [_downloadOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Successfully downloaded file to %@", [weakSelf.item localUrl]);
        [Helper saveItemDownloaded:weakSelf.item.productId];
        weakSelf.isDownloading = NO;
        [weakSelf.progressOverlayView removeFromSuperview];
        [weakSelf setUserInteractionEnabled:YES];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        [weakSelf.progressOverlayView removeFromSuperview];
        [weakSelf setUserInteractionEnabled:YES];
        weakSelf.isDownloading = NO;
        }];
    [_downloadOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        float progress = totalBytesRead / (float)totalBytesExpectedToRead;
        weakSelf.progressOverlayView.progress = progress;
    }];
    [[NSOperationQueue mainQueue] addOperation:_downloadOperation];

ItemCell中的属性是:

@property (nonatomic, retain) AFHTTPRequestOperation *downloadOperation;

成功下载1-2次(20mb)后,我收到内存警告。内存使用随着每次下载而增加,并且在下载完成时永远不会减少。

enter image description here

来自仪器: enter image description here

2 个答案:

答案 0 :(得分:2)

我认为使用AFNetworking下载文件的首选方法是设置“outputStream”属性。

根据AFNetworking文件:

  

在请求完成之前用于写入数据的输出流。

     

默认情况下,数据会累积到一个缓冲区中,该缓冲区会在请求完成后存储到responseData中。设置outputStream后,数据将不会累积到内部缓冲区中,因此,已完成请求的responseData属性将为nil。输出流将在设置后在网络线程runloop中进行调度。

我遇到了同样的问题,使用“outputStream”来解决它。

答案 1 :(得分:0)

每个下载的文件使用@autorelease:

for(File* file in fileList)
{
    @autoreleasepool {
        [self downloadFile:file];
    } 
}

这将释放您下载的单独文件之间分配的所有变量和数据。

此外,您应该追踪那些内存泄漏。我在乐器截图中看到了一些可见的内容。