2011年12月27日火曜日

NSArray/NSDictionaryをファイルに書き出す方法

NSArray(やNSDictionary)をファイルに書き出す場合、通常は
[array writeTofile:@"パス名"];
一発でいける。

ところが、arrayの要素がNSクラス(から継承されたクラス)でない場合、
これでは書き出せない。
正確には、NSCodingプロトコルに準拠しているクラスでないと書き出せない。
(書き出し時にエラーが発生する。)

たとえば、Cの構造体を要素にしている場合とかがこれに相当する。
NSValueが含まれる場合も、実体が任意のアドレス内容であるため同じ。

そういう場合は、要素毎NSDataに変換して出力する。
こんな感じ。
[[NSFileManager defaultManager]createFileAtPath:path contents:nil attributes:nil];
id fp=[NSFileHandle fileHandleForWritingAtPath:path];
typedef struct {
   // 構造体定義
} ST;
ST st1;
NSValue *val;
NSEnumerator *emu=[lineArray objectEnumerator];
while (val=[emu nextObject]) {
    // 1行ごと構造体に読みなおして書きだす
    [val getValue:&st1];
    NSData *data = [NSData dataWithBytes:&st1length:sizeof(ST)];
    [fp writeData:data];
}
[fp closeFile];
NSValueの場合はNSString stringWithFormat:で文字列化して書き出すという手もある。

ついでにいえば、NSArrayをNSDataに変換する方法、
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
[fp writeData:data];
を使ってもでもだめ。これもNSCodingがないから。

ちょっとしたテクニックかも。








0 件のコメント:

コメントを投稿