1

奇妙な問題があります。要件は、スワイプで 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 のままであることを確認しました (これを超えることはありません)。

詳細が必要な場合はお知らせください。

4

1 に答える 1

1

すべての画像が仮想メモリに保存されているため、クラッシュします。それらをキャッシュしてから、ユーザーが実際に表示したときにメモリにロードし直す必要があります。

画像オブジェクトがキャッシュされた後、または不要になった後も、画像オブジェクトを nil に設定してみてください。

あなたのクラスでは、 didReceiveMemoryWarning メソッドを使用して、これが呼び出されたときにメモリから画像の一部を解放することもお勧めします。

于 2013-03-08T10:55:45.963 に答える