S3GetObjectRequest 具有 NSMutableData* 主体,其中附加了它下载的所有数据。
对于大文件,随着下载的进行,数据会不断附加,并且超过了 90MB 的 VM 限制,然后应用程序被 iOS 杀死。
快速而肮脏的解决方法是创建自己的 S3GetObjectRequest 和 S3GetObjectResponse 类。AWS 框架根据请求的类名称实例化响应(请求的类名称没有最后 7 个字符“请求”并附加“响应”,并尝试实例化该名称的新类)。
然后覆盖-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data以一直释放正文。
这是一个快速而肮脏的修复,因为您仍然有恒定的数据分配、附加然后释放。但是当你处于紧要关头时它会起作用。对于我下载 150-700mb 文件的使用情况,这个简单的 hack 将应用程序的内存使用量平均保持在 2.55mb,+/- 0.2mb。
正如 ASIHTTP 库的作者所说,它不再被维护。
请求 - LargeFileS3GetObjectRequest.h
@interface LargeFileS3GetObjectRequest : S3GetObjectRequest
@end
请求 - LargeFileS3GetObjectRequest.m
@implementation LargeFileS3GetObjectRequest
@end
响应 - LargeFileS3GetObjectResponse.h
@interface LargeFileS3GetObjectResponse : S3GetObjectResponse
@end
响应 - LargeFileS3GetObjectResponse.m
@implementation LargeFileS3GetObjectResponse
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// allow original implementation to send data to delegates
[super connection:connection didReceiveData:data];
// release body and set it to NULL so that underlying implementation doesn't
// append on released object, but instead allocates new one
[body release];
body = NULL;
}
@end
希望能帮助到你。