Mac OS Xにおいてオブジェクトの永続化に用いられるファイル形式plist。前回紹介したFoundationと同様に基本的なデータ構造を扱うフレームワークである「CoreFoundation」の紹介を交えつつ、「Mac OS Xの『魂』」であるFoundationとplistの理解を深めていく。
CoreFoundationは、C言語で作成された、Foundationと同様に基本的なデータ構造を扱うフレームワークだ。Objective-CベースではないためCocoa以外のCやC++によるフレームワークとも組み合わせられる。
CoreFoundationにはFoundationと同じ文字列や数値、データ、配列、ディクショナリといったクラスが存在し、それぞれCFString、CFNumber、CFArray、CFDictionaryという名前である。もちろんこれらのクラスはplistの要素と1対1で対応している。
CoreFoundationでは、plistの読み書きにはCFPropertyListに属する関数を利用する。リスト1は前回紹介したリスト4を、リスト2は前回紹介したリスト5をそれぞれCoreFoundationで書き直したものだ*。またリスト1の実行結果が実行例1で、リスト2の実行結果が実行例2である。
#include <CoreFoundation/CoreFoundation.h>
#include <string.h>
/*
* cc -o cfplistread cfplistread.c -framework CoreFoundation
*/
int main( int argc, char *argv[] )
{
const char *filecname;
CFURLRef filename;
CFDataRef filecontent ;
CFTypeRef plist;
int errornum = 0;
CFStringRef errorString;
filecname = argc > 1 ? argv[1] : "foo.plist" ;
filename = CFURLCreateFromFileSystemRepresentation(
kCFAllocatorDefault,
filecname,
strlen( filecname ),
false );
CFURLCreateDataAndPropertiesFromResource(
kCFAllocatorDefault,
filename,
&filecontent,
NULL,
NULL,
&errornum );
plist = CFPropertyListCreateFromXMLData(
kCFAllocatorDefault,
filecontent,
kCFPropertyListImmutable,
&errorString );
CFShow( plist );
CFRelease( plist );
CFRelease( filecontent );
CFRelease( filename );
exit(0);
}
% ./cfplistread list2.plist
<CFDictionary 0x500ea0 [0xa0728150]>{type = mutable, count = 2, capacity = 17, pairs = (
7 : <CFString 0x500e70 [0xa0728150]>{contents = "\u30ad\u30fc1"} = <CFString 0x500e90 [0xa0728150]>{contents = "\u50241"}
16 : <CFString 0x500f90 [0xa0728150]>{contents = "\u30ad\u30fc2"} = <CFArray 0x5010d0 [0xa0728150]>{type = mutable-small, count = 3, values = (
0 : <CFString 0x5010e0 [0xa0728150]>{contents = "\u914d\u5217\u30e1\u30f3\u30d0\u30fc1"}
1 : <CFString 0x501120 [0xa0728150]>{contents = "\u914d\u5217\u30e1\u30f3\u30d0\u30fc2"}
2 : <CFString 0x501100 [0xa0728150]>{contents = "\u914d\u5217\u30e1\u30f3\u30d0\u30fc3"}
)}
)}
% ./cfplistwrite
% cat bar.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
> "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Key1</key>
<string>Value1</string>
<key>Key2</key>
<dict>
<key>SubKey1</key>
<string>Value2</string>
</dict>
<key>Key3</key>
<array>
<string>Member1</string>
<string>Member2</string>
<string>Member3</string>
</array>
</dict>
</plist>
CoreFoundationはFoundationに比べ機能が少ないこともあり、少々行数は増えているが、やっていることはほぼ同じであると理解していただけるだろう。
CoreFoundationでは、ファイルの読み込みや書き出し先の指定はすべてURL(CFURL)で行うように統一されている。
Copyright © ITmedia, Inc. All Rights Reserved.