連載
» 2007年05月30日 03時32分 公開

Undocumented Mac OS X:第4回 plist(プロパティリスト)とFoundation【後編】 (1/3)

Mac OS Xにおいてオブジェクトの永続化に用いられるファイル形式plist。前回紹介したFoundationと同様に基本的なデータ構造を扱うフレームワークである「CoreFoundation」の紹介を交えつつ、「Mac OS Xの『魂』」であるFoundationとplistの理解を深めていく。

[白山貴之,ITmedia]

plistとCoreFoundation

 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); }
リスト1 plistを読み込むサンプル(CoreFoundation版)
リスト2 plistを書き出すサンプル(CoreFoundation版)

% ./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"}
)}
)}

実行例1 リスト1の実行結果
./cfplistwritecat 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>

実行例2 リスト2の実行結果

 CoreFoundationはFoundationに比べ機能が少ないこともあり、少々行数は増えているが、やっていることはほぼ同じであると理解していただけるだろう。

このページで出てきた専門用語

CoreFoundationで書き直したものだ

CoreFoundationでは、ファイルの読み込みや書き出し先の指定はすべてURL(CFURL)で行うように統一されている。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ

マーケット解説

- PR -