我正在开发一款应用程序,可以下载资源并将其写入磁盘供以后离线使用,而且它始终是自定义内容。目前我们正在处理大约有4000个JPG的内容。用户将内容的下载初始化到iPad上,并且UI中有一个进度条,因此用户基本上等到它完成。问题是分配了大约180 - 190 MB的内存,它崩溃了。
我在仪器中看到的是 CFData(商店)是罪魁祸首,我的理解是 CFData(商店)是NSURLConnection请求的缓存。
我试过了:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
和
[[NSURLCache sharedURLCache] removeAllCachedResponses];
以及设置缓存策略,没有任何改进。
供参考,这是我的帖子请求:
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *contentType = [NSString stringWithFormat:@"text/xml"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[xmlMessage dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
//get response
NSHTTPURLResponse* urlResponse = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&httpError];
任何帮助都会得到热烈的掌声。
答案 0 :(得分:0)
如果您确实希望对同步请求执行此操作,那么您可以考虑明确重新定位并释放每个请求中使用的对象。使用自动释放池意味着每个请求的剩余碎屑都位于自动释放池中,直到池耗尽为止。
如果你有一个for循环或其他循环来处理这些请求,你也可以在循环中创建一个更本地的自动释放池,然后在循环结束之前将其排空。如果你这样做并且你想要保留的数据超出了那个循环(和池)的范围,那么你应该将它保留在循环中并在稍后的某个时刻重新发送它。
在某些时候,根据您的经验水平,您应该考虑在辅助线程上执行此操作。您可以将每个fetch视为一个独立的操作,然后使用NSOperation和NSOperationQueue之类的东西来管理它。这样,您可以同时启动多个操作,而不是在等待每个响应时阻止您的线程。