1. ホーム
  2. ios

[解決済み] NSCacheの使用方法

2022-08-18 18:58:36

質問

誰か NSCache を使用して文字列をキャッシュする方法を教えてください。 または、誰か良い説明へのリンクを持っていますか?私は何も見つけることができないようです。

どのように解決するのですか?

と同じように使用します。 NSMutableDictionary . 違いは NSCache が過度のメモリ圧迫(つまり、あまりにも多くの値をキャッシュしている)を検出すると、それらの値のいくつかを解放してスペースを確保することです。

実行時にそれらの値を再作成できる場合 (インターネットからダウンロードする、計算する、など) は NSCache はあなたのニーズに合うかもしれません。データを再作成できない場合 (例えば、ユーザー入力である、時間的制約がある、など) は、そのデータを NSCache に格納してはいけません。

スレッドセーフを考慮しない例。

// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");

// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
    // It's not in the cache yet, or has been removed. We have to
    // create it. Presumably, creation is an expensive operation,
    // which is why we cache the results. If creation is cheap, we
    // probably don't need to bother caching it. That's a design
    // decision you'll have to make yourself.
    myWidget = [[[Widget alloc] initExpensively] autorelease];

    // Put it in the cache. It will stay there as long as the OS
    // has room for it. It may be removed at any time, however,
    // at which point we'll have to create it again on next use.
    [myCache setObject: myWidget forKey: @"Important Widget"];
}

// myWidget should exist now either way. Use it here.
if (myWidget) {
    [myWidget runOrWhatever];
}