我有一个奇怪的问题。要求是在刷卡上从网址下载图像并在图像视图中显示它。它工作正常,但是在30张图像之后以及几次刷卡应用程序崩溃后我收到内存警告。
实施非常简单,但已花了将近2天的时间才弄明白问题。 在每次滑动时,我称之为方法: -
-(void)callDownloadImageAPI{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
[self loadIndicator:@"Please Wait.!!" :@"Please be patient while we are downloading image for you"];
@try{
DownloadImage *downLoadImge =[[DownloadImage alloc] init];
downLoadImge.delegate=self;
[downLoadImge getImage:[self.allUrlArray objectAtIndex:self.initialImageViewCounter]];
}
@catch (NSException *e) {
NSLog(@"callDownloadImageAPI exception %@",[e description]);
[HUD hide:YES];
}
[pool release];
}
此方法一次下载1张图像并将UIImage发送给其代理
// DownloadImage.h和.m
的实现 @protocol DownloadImageDelegate
@required
- (void)messageFormServerWithImage:(UIImage*)imageFromSever;
- (void)gettingImageFailed :(NSString*)errorDesc;
@end
@interface DownloadImage : NSObject
@property(strong) NSURLConnection* connection;
@property(weak) id<DownloadImageDelegate> delegate;
@property(strong) NSMutableData* data;
-(void)getImage:(NSString *)imageUrl;
// DownloadImage.m
-(void)getImage:(NSString *)imageUrl{
@autoreleasepool {
[[NSURLCache sharedURLCache] removeAllCachedResponses];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
}
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
@autoreleasepool {
NSLog(@"connectionDidFinishLoading");
self.connection=nil;
if( self.data == nil) {
return;
}
// NSString* jsonStr = [[NSString alloc] initWithData:self.data encoding:NSASCIIStringEncoding];
UIImage *img=[UIImage imageWithData:self.data];
// NSArray *messages_json = [parser objectWithString:jsonStr error:nil];
[self.delegate messageFormServerWithImage:img];
self.data = nil;
img= nil;
}
}
NSUrlConnections的其他代表已经实施,但我没有把它放在这里。 返回此图像后,我将此图像设置为scrollview并显示它并从scrollview中删除上一个图像。
更多信息: -
只是为了验证我将设置图像注释到scrollview并在每次滑动时下载了图像但仍然会在30张图像周围崩溃
令人惊讶的是,我使用相同的类DownloadImage.h和.m在同一作品的其他地方下载图像,即使使用500images也能正常工作。
我正在测试iPod Touch,我检查了使用的内存保持在12-14mb之间(绝不超过这个)
请帮帮我们,让我知道你是否需要更多细节。
答案 0 :(得分:1)
由于所有图像都存储在虚拟内存中,因此崩溃,您需要缓存它们,然后在用户实际查看它们时将它们加载回内存。
尝试在缓存或不需要后将图像对象设置为nil。
在你的课程中,我还建议使用didReceiveMemoryWarning方法,并在调用时从内存中释放一些图像。