2

まず第一に、ARCにはさらに大きな問題があり、メモリ管理を完全に制御する必要があるため、ARCを使用していません。

状況は次のとおりです。サーバーから多くのリモートJPEG画像をロードし、それらをスクロールビューで表示する必要があります。ユーザーが少し下にスクロールすると、スクロールビューの一番上の画像が解放されます。これは機能しており、含まれているビューはすべて正常に解放されます。問題は、リモートイメージをロードした後、多くのメモリが割り当てられたままになり、解放されないことです。リモート画像をフェッチするための私のコードは次のとおりです(UIImageViewをサブクラス化):

- (void)downloadImage    {
    NSData *posterData = [[NSData alloc] initWithContentsOfURL:self.url options:NSDataReadingUncached error:nil];
    UIImage *img = [[UIImage alloc] initWithData:posterData];
    [posterData release];
    self.image = img;
    [img release];
}
// that gets called from:
- (void)setImageFromURL:(NSURL *)_url{
    [NSThread detachNewThreadSelector:@selector(downloadAndLoadImage) toTarget:self withObject:nil];
}

Instrumentsを使用してコードを検査すると、UIImageViewは意図したとおりに解放されますが、それでも次のものがメモリに残り、スパムを送信します。 楽器

どうやらCFData、Malloc 9.00 KB、NSConcreteDataはすべて私のdownloadImageメソッドの結果です。私は何が間違っているのですか?これは私を夢中にさせています...どのようにして多くのリモートイメージをメモリセーフにロードしますか?NSURLConnectionも試しましたが、かなり悪く、良くなりました。:(

画像サイズは6から25KBまで変化します。

よろしくお願いします!

アップデート

うまく機能し、非常に使いやすいSDWebImageを使用することになりました。

4

1 に答える 1

0

画像のダウンロードはバックグラウンド スレッドですか? はいの場合、どこNSAutoreleasePoolですか?追加する必要があります:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

// your downloading thread code here

[pool release];

またはARCの場合:

@autoreleasepool {

    // your downloading thread code here

}

また、画像のダウンロードがバックグラウンド スレッドで発生する場合はself.image = img;、メイン スレッドで呼び出す必要があります。UI 要素はメイン スレッドからのみ変更する必要があるためです。

[self performSelectorOnMainThread:@selector(setImage:) withObject:img waitUntilDone:YES];

実際、 SDWebImageライブラリはあなたのためにすべてを行い、memcacheとディスクキャッシュを持っています

于 2012-10-27T14:21:12.293 に答える