奇妙な問題があります。要件は、スワイプで URL から画像をダウンロードし、画像ビューに表示することです。すべて正常に動作していますが、30 枚の画像の後、さらにスワイプ アプリがクラッシュした後にメモリ警告が表示されます。
実装は非常に簡単ですが、問題を解決するためにすでにほぼ 2 日を費やしています。各スワイプで、Aメソッドを呼び出しています:-
-(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 の他のデリゲートが実装されていますが、ここには入れません。この画像が返されたら、この画像をスクロールビューに設定して表示し、スクロールビューから前の画像を削除します。
より詳しい情報:-
確認するために、画像をスクロールビューに設定することをコメントアウトし、スワイプごとに画像をダウンロードしましたが、それでも約30枚の画像がクラッシュします
驚いたことに、同じクラスの DownloadImage.h と .m を使用して、同じ作品の他の場所に画像をダウンロードしています。
私は iPod Touch でテストしており、使用されているメモリが 12 ~ 14 MB のままであることを確認しました (これを超えることはありません)。
詳細が必要な場合はお知らせください。