タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(16)Preferencesの組み込み(4)環境設定の永続記憶カテゴリーJava, Cocoa, 今から始めるCocoaプログラミング
作成日2002/1/29 15:55:16作成者新居雅行
環境設定ウインドウで設定した初期ウインドウのサイズは、このままだと変数にセットしているだけなので、当然ながら、アプリケーションを終了すると消えてしまう。環境設定は再度起動したときに同じ値が得られていないと意味がない。一般的には、環境設定の結果をファイルに保存するのだが、Mac OS 9まではシステムフォルダの「初期設定」フォルダにファイルを作って…ということをしていた。しかしながら、Cocoaではそんな「ファイル処理」を一切しなくても、システムに値を永続的に記録する機能が用意されている。単に用意されているメソッドを呼び出すだけで、値を記録したり、あるいは取り出したりができるのである。おおざっぱな原理は、背後でPreferencesフォルダにファイル記憶を行うのだが、そうした処理が完全に抽象化されているのである。これらの一連の機能はUser Defaultsと呼ばれており、NSUserDefaultsというクラスで利用できるようになる。

◇NSUserDefaults
 http://devworld.apple.com/techpubs/macosx/Cocoa/Reference/Foundation/Java/Classes/NSUserDefaults.html

まず、User Defaultsを使うには、アプリケーションの識別子をきちんと設定する。識別子は基本的には何でも良いのだが、通常はドメイン名の逆順を指定するようだ。つまり、Javaのパッケージのネーミングである。自分のドメインをからめた名前にしておけば、別のアプリケーションと同じ設定の競合が出るということはない。

◇アプリケーション設定の識別子をきちんと設定しておく
 

この識別子は設定の集合を識別するために使うのであるが、その背後では、設定値をファイルに保存するときのファイル名となる。Library/Preferencesフォルダに、たくさんファイルがあるが、そこに「識別子.plist」というファイル名で、設定値が保存され、必要に応じて設定値が読み出される。プログラマは特にこのファイルを開いたりどうこうするということはないのだが、ファイルの存在は知っておくべきだろう。そして、実際に開くと、XMLフォーマットで設定値が保存されているのが分かる。

まずは、NSUserDefaultsの使い方をまとめておこう。代表的なメソッドを紹介する。クラスなのでコンストラクタを使うと思ってしまうが、NSUserDefaultsは少し違っていて、すでに生成されているインスタンスを、以下のクラスメソッドでまずは取ってくる。User Defaultsはアプリケーションごとというよりも、いろいろな利用範囲がある。詳細はドキュメントを見てもらいたいが、いずれにしても、以下のメソッドで得られるインスタンスは、自分のアプリケーションの識別子を持つUser Defaultsが管理できる状態になっているのである。

☆NSUserDefaultsのインスタンスを得る(Static)
 NSUserDefaults NSUserDefaults.standardUserDefaults();
 戻り値:NSUserDefaultsのインスタンス

次に、値の実際の保存や取り出しは以下のようなメソッドを使うのであるが、まず原則は、値には「名前」をつけるということだ。名前をキーにして、取り出しを行う。従って、名前が違っていれば、複数の値を設定できるということである。なお、識別子と名前と両方あるように思うかもしれないが、識別子は(名前, 値)のセットを複数記録したものの集合体を指すものである。
値の設定や取り出しはデータの種類ごとに用意されているが、基本データは、基本データ向けのメソッドを使う。オブジェクトを記憶するときにはsetObjectForKeyを使うが、取り出しには形式に応じていくつかのメソッドが用意されている。

☆User Defaultsに値を名前を付けて設定する
 void 〈NSUserDefaults〉.setIntegerForKey( int value, String defaultName)
 void 〈NSUserDefaults〉.setLongForKey( long value, String defaultName)
 void 〈NSUserDefaults〉.setBooleanForKey( boolean value, String defaultName)
 void 〈NSUserDefaults〉.setDoubleForKey( double value, String defaultName)
 void 〈NSUserDefaults〉.setFloatForKey( float value, String defaultName)
 void 〈NSUserDefaults〉.setObjectForKey( Object value, String defaultName)
 引数:value:設定する値
    defaultName:設定値につける名前

☆User Defaultsから値を取り出す
 int 〈NSUserDefaults〉.integerForKey(String defaultName)
 long 〈NSUserDefaults〉.longForKey(String defaultName)
 boolean 〈NSUserDefaults〉.booleanForKey(String defaultName)
 double 〈NSUserDefaults〉.doubleForKey(String defaultName)
 float 〈NSUserDefaults〉.floatForKey(String defaultName)
 Object 〈NSUserDefaults〉.objectForKey(String defaultName)
 String 〈NSUserDefaults〉.stringForKey(String defaultName)
 NSData 〈NSUserDefaults〉.dataForKey(String defaultName)
 NSArray 〈NSUserDefaults〉.arrayForKey(String defaultName)
 NSDictionary 〈NSUserDefaults〉.dictionaryForKey(String defaultName)
 戻り値:引数の名前に対応した取り出した値
 引数:defaultName:名前

☆User Defaultsに設定してある値を削除する
 void 〈NSUserDefaults〉.removeObjectForKey(String defaultName)
 引数:defaultName:削除対象の名前

☆User Defaultsに値をまとめて設定する
 void 〈NSUserDefaults〉.registerDefaults(NSDictionary dictionary)
 引数:dictionary:名前と値をセットにしたオブジェクト

以上のメソッドにはいずれも識別子の指定はない。アプリケーションの中で、上記のメソッドを使う限りは、識別子はアプリケーションに設定されたものが使われるのである。つまり、プログラマは、Project Builderを使う上での設定を行うだけで、後は何も気遣いは必要ないというわけである。
なお、基本データ型の取り出しは、integerForKeyを使うのであるが、もし、名前が定義されていない場合には、値として0を戻す。これだと、値が定義されていないのか、あるいは0が定義されているのか、判断がつかない。そのような場合には、objectForKeyメソッドを使って戻り値を調べる。もし、nullが戻されたら、その名前の値は定義されていないことになる。
registerDefaultsはまとめて値をセットするときには便利なメソッドだ。これらの使い方は実際のプログラムで示そう。
(この項、続く)
関連リンク