macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSCacheクラス

INDEX>Foundation> >NSCache

解説

apple(OS X)
apple(iOS)

編集時バージョン OS X 10.8 iOS 6.1

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 OS X 10.6以降
使用可能 iOS 4.0以降
定義 NSCache.h

概要

一時的なオブジェクトの保管のためのNSDictionaryに似たキーと値を保持できるクラスです。キーと値ともに変更可能です。
残りメモリが少なくなってきたときに自動的にオブジェクトを破棄してメモリを解放するための仕組みを備えています。オブジェクトのサイズをコストと呼び、キャッシュ全体で合計コスト値がいくらになれば自動的にオブジェクトを破棄するかの設定ができます。
また、コストの他にオブジェクトの個数も設定することができます。

作成

allocで作成してinitで初期化します。

キャッシュ名

デリゲートメソッドでどのキャッシュかを認識できるように名前をつけることができます。名前をつけるメソッドは(– setName:)で、名前を取得するメソッドは(– name)です。

キャッシュ値を取得する

キーで指定して値を取得する場合は(– objectForKey:)メソッドを使用します。

キャッシュ値の追加と除去

一つのオブジェクトを追加するには(– setObject:forKey:)メソッドを使用します。オプションとしてコストをセットする場合は(– setObject:forKey:cost:)メソッドを使用します。指定したキーでオブジェクトを除去するには(– removeObjectForKey:)メソッドを使用します。すべてのオブジェクトを除去するには(– removeAllObjects)メソッドを使用します。

Managing Cache Sizeキャッシュサイズの管理

自動破棄される上限の要素数を設定するには(– setCountLimit:)メソッドを使用し、取得するには(– countLimit)メソッドを使用します。
自動破棄される上限のコスト(通常はサイズ)を設定するには(– setTotalCostLimit:)メソッドを使用し、取得するには(– totalCostLimit)メソッドを使用します。

破棄されるコンテンツの管理

設定した要素数またはコストを超えた場合、自動的に破棄するかどうかを設定できます。設定するメソッドは(– setEvictsObjectsWithDiscardedContent)で、状況を確認するメソッドは(– evictsObjectsWithDiscardedContent)です。デフォルトではYESになっています。

デリゲートの管理

オブジェクトが破棄されようとするときにデリゲートメソッド(- (void)cache:(NSCache *)cache willEvictObject:(id)obj)が呼び出されます。そのデリゲートオブジェクトを設定するメソッドが(– setDelegate:)で、デリゲートオブジェクトを取得するメソッドが(– delegate)です。

カウント値を設定してどのオブジェクトが破棄されるのかのテスト

#pragma mark setCountLimit:
-(void)method001
{
    
    NSCache *aCache = [[NSCache alloc] init]; 
    [aCache setCountLimit:3];
    [aCache setName:@"method001"];
    
    [aCache setObject:@"Obj1" forKey:@"key1"]; 
    NSLog(@"%s : %@,%@,%@,%@,%@", __FUNCTION__,[aCache objectForKey:@"key1"],[aCache objectForKey:@"key2"],[aCache objectForKey:@"key3"],[aCache objectForKey:@"key4"],[aCache objectForKey:@"key5"]);
    
    [aCache setObject:@"Obj2" forKey:@"key2"]; 
    NSLog(@"%s : %@,%@,%@,%@,%@", __FUNCTION__,[aCache objectForKey:@"key1"],[aCache objectForKey:@"key2"],[aCache objectForKey:@"key3"],[aCache objectForKey:@"key4"],[aCache objectForKey:@"key5"]);
    [aCache setObject:@"Obj3" forKey:@"key3"]; 
    NSLog(@"%s : %@,%@,%@,%@,%@", __FUNCTION__,[aCache objectForKey:@"key1"],[aCache objectForKey:@"key2"],[aCache objectForKey:@"key3"],[aCache objectForKey:@"key4"],[aCache objectForKey:@"key5"]);
    [aCache setObject:@"Obj4" forKey:@"key4"]; 
    NSLog(@"%s : %@,%@,%@,%@,%@", __FUNCTION__,[aCache objectForKey:@"key1"],[aCache objectForKey:@"key2"],[aCache objectForKey:@"key3"],[aCache objectForKey:@"key4"],[aCache objectForKey:@"key5"]);
    [aCache setObject:@"Obj5" forKey:@"key5"]; 
    NSLog(@"%s : %@,%@,%@,%@,%@", __FUNCTION__,[aCache objectForKey:@"key1"],[aCache objectForKey:@"key2"],[aCache objectForKey:@"key3"],[aCache objectForKey:@"key4"],[aCache objectForKey:@"key5"]);
    
    // countLimitが3の場合、最初の2つは保持されるが、最後のオブジェクトは新しいオブジェクトをセットしようとすると破棄される。
    //=>-[OOOAppDelegate method001] : Obj1,(null),(null),(null),(null)
    //=>-[OOOAppDelegate method001] : Obj1,Obj2,(null),(null),(null)
    //=>-[OOOAppDelegate method001] : Obj1,Obj2,Obj3,(null),(null)
    //=>-[OOOAppDelegate method001] : Obj1,Obj2,(null),Obj4,(null)
    //=>-[OOOAppDelegate method001] : Obj1,Obj2,(null),(null),Obj5
    
}

メソッド

キャッシュ名の修正

– name
– setName:

キャッシュ値の取得

– objectForKey:

キャッシュ値の追加と除去

– setObject:forKey:
– setObject:forKey:cost:
– removeObjectForKey:
– removeAllObjects

キャッシュサイズの管理

– countLimit
– setCountLimit:
– totalCostLimit
– setTotalCostLimit:

不要な内容の管理

– evictsObjectsWithDiscardedContent
– setEvictsObjectsWithDiscardedContent:

デリゲートの管理

– delegate
– setDelegate:

定数


サブクラス化の注意