我正在实现一个需要通过HTTP获取大量图片的iOS应用程序。我尝试了几种方法,但不管我做什么,Instruments都显示不断增加的内存分配,并且当我在设备上运行时,应用程序迟早会崩溃。Instruments没有显示任何泄漏。
到目前为止,我已经尝试了以下方法:
- 在NSOperation中使用同步的NSURLConnection获取图像 - 在NSOperation中使用异步的NSURLConnection获取图像 - 在主线程中使用[NSData dataWithContentsOfURL:url]获取图像 - 在NSOperation中使用同步的ASIHTTPRequest获取图像 - 将异步的ASIHTTPRequest添加到NSOperationQueue中获取图像 - 使用completionBlock使用异步的ASIHTTPRequest获取图像
Instrumetns中的调用树显示,在处理HTTP响应时消耗了内存。在异步NSURLConnection的情况下,这在...
当请求在单独的线程中完成时,我正在使用NSAutoReleasePool,并尝试使用[[NSURLCache sharedURLCache] removeAllCachedResponses]释放内存,但没有成功。
有什么想法/提示来解决这个问题吗?谢谢。
编辑:只有在使用CoreData持久化图像时才会出现这种行为。这是我作为NSInvocationOperation运行的代码:
到目前为止,我已经尝试了以下方法:
- 在NSOperation中使用同步的NSURLConnection获取图像 - 在NSOperation中使用异步的NSURLConnection获取图像 - 在主线程中使用[NSData dataWithContentsOfURL:url]获取图像 - 在NSOperation中使用同步的ASIHTTPRequest获取图像 - 将异步的ASIHTTPRequest添加到NSOperationQueue中获取图像 - 使用completionBlock使用异步的ASIHTTPRequest获取图像
Instrumetns中的调用树显示,在处理HTTP响应时消耗了内存。在异步NSURLConnection的情况下,这在...
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
在同步的NSURLConnection情况下,Instruments显示一个不断增长的CFData(存储)条目。与异步的NSURLConnection在类似的代码位置出现了与ASIHTTPRequest相同的问题。[NSData dataWithContentsOfURL:url]方法在确切的语句中显示出不断增加的内存总量分配。当请求在单独的线程中完成时,我正在使用NSAutoReleasePool,并尝试使用[[NSURLCache sharedURLCache] removeAllCachedResponses]释放内存,但没有成功。
有什么想法/提示来解决这个问题吗?谢谢。
编辑:只有在使用CoreData持久化图像时才会出现这种行为。这是我作为NSInvocationOperation运行的代码:
-(void) _fetchAndSave:(NSString*) imageId {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *url = [NSString stringWithFormat:@"%@%@", kImageUrl, imageId];
HTTPResponse *response = [SimpleHTTPClient GET:url headerOrNil:nil];
NSData *data = [response payload];
if(data && [data length] > 0) {
UIImage *thumbnailImage = [UIImage imageWithData:data];
NSData *thumbnailData = UIImageJPEGRepresentation([thumbnailImage scaleToSize:CGSizeMake(55, 53)], 0.5); // UIImagePNGRepresentation(thumbnail);
[self performSelectorOnMainThread:@selector(_save:) withObject:[NSArray arrayWithObjects:imageId, data, thumbnailData, nil] waitUntilDone:NO];
}
[pool release];
}
所有与CoreData相关的操作都在主线程中完成,因此不应该存在任何CoreData多线程问题。但是,如果我将图像进行持久化,Instruments会显示出在上述位置不断增加的内存分配。
编辑 II:
与CoreData相关的代码:
-(void) _save:(NSArray*)args {
NSString *imageId = [args objectAtIndex:0];
NSData *data = [args objectAtIndex:1];
NSData *thumbnailData = [args objectAtIndex:2];
Image *image = (Image*)[[CoreDataHelper sharedSingleton] createObject:@Image];
image.timestamp = [NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]];
image.data = data;
Thumbnail *thumbnail = (Thumbnail*)[[CoreDataHelper sharedSingleton] createObject:@"Thumbnail"];
thumbnail.data = thumbnailData;
thumbnail.timestamp = image.timestamp;
[[CoreDataHelper sharedSingleton] save];
}
从CoreDataHelper(self.managedObjectContext选择了当前线程中可用的NSManagedObjectContext):
-(NSManagedObject *) createObject:(NSString *) entityName {
return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
}