0

画像のキャッシュが必要なアプリケーションを開発しています。これを行うために、私はJMImageCacheライブラリを使用しています。キャッシングには問題なく動作します。ただし、次の行で占有されているメモリを解放することはできません。

[NSData dataWithContentsOfFile]

ここでは、ディスクから画像をキャッシュするためのコンテンツコードを作成する関数です。

- (UIImage *) imageFromDiskForURL:(NSString *)url {
    NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
    UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
    data = nil;
    [data release];
    return i;
}

私はそれを機器でチェックしました、そしてそれは毎回2.34MBを割り当てます。

4

3 に答える 3

5
data = nil;
[data release];

なぜこれが機能すると期待するのですか?なぜこれが元のデータを公開する必要があるのですか? releaseにメッセージを送信していますがnil、これはノーオペレーションです。

allocさらに、またはを使用してオブジェクトを作成しないとcopy、自動解放されます。つまり、もう一度リリースすると、オーバーリリースされ、アプリがクラッシュする可能性が高くなります。必要なものは次のとおりです。

1。メソッド呼び出しを明示的な自動解放プールにラップします。

- (UIImage *)imageFromDiskForURL:(NSString *)url
{
    UIImage *i;
    @autoreleasepool {
        NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
        i = [[UIImage alloc] initWithData:data];
    }
    return [i autorelease];
}

2、alloc-init または手動でデータ オブジェクトを解放します。

- (UIImage *)imageFromDiskForURL:(NSString *)url
{
    NSData *data = [[NSData alloc] initWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
    UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
    [data release];
    return i;
}
于 2013-01-29T07:26:25.937 に答える
1

シーケンス nil を変更してリリースする

[data release];
data = nil;

キャッシュをクリアするには、次のデリゲート メソッドを使用します

[[JMImageCache sharedCache] removeAllObjects];
[[JMImageCache sharedCache] removeImageForURL:@"http://dundermifflin.com/i/MichaelScott.png"];

ライブラリの read me ファイルを読む https://github.com/jakemarsh/JMImageCache/blob/master/README.markdown

于 2013-01-29T07:31:31.497 に答える
0

UIImage が渡すデータを使用する方法が原因で、あなたがしようとしていることは機能しません。データ オブジェクトはイメージによって保持されます。より正確には、UIImage が内部的に持つ CGImageSource によって保持されます。このデータから、いつでも解凍してイメージを作成できます。圧縮解除されたデータを保持する CGImageSource のオプションもありますが、UIImage は小さな UI グラフィック用に最適化されているため、それを使用しません。

メモリ プレッシャーを軽減するためにできることの 1 つは、NSData 全体をメモリにロードするのではなく、代わりにメモリ マップすることです。これにより、イメージの作成または再作成が少し遅くなりますが、作成された NSData オブジェクトは比較すると非常に小さくなります。

于 2013-01-29T08:08:47.867 に答える