Objective-C:アーカイブとアンアーカイブ
2012/11/14
category: Objective-C | tag: iOS, iPhone, Sandbox | no comments
Objective-CのFoundationフレームワークには、オブジェクトをバイト列に変換する仕組みがあります。
嬉しいことに、ファイルへの保存とファイルからの読み込みを行う仕組みまで備わっています。
プログラム内で生成した配列データのファイルへの保存と、ファイルからの読み込みを試してみました。
アーカイブしてファイルに保存
プログラム中で使用している(NSMutableArray *)arrayをアーカイブしてファイルに保存します。
1 2 3 4 5 6 7 |
NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *path = [dir stringByAppendingPathComponent:@"data.dat"]; if ([NSKeyedArchiver archiveRootObject:array toFile:path]) { printf("Save : Successfull\n"); } |
1, 2行目:Documentsディレクトリを取得しファイルパスを生成
4行目:アーカイブするオブジェクトとファイルパスを指定
ファイルからの読み込んでアンアーカイブ
アーカイブされたデータをファイルから読み込み、アンアーカイブしています。
1 2 3 4 5 |
NSString *dir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *path = [dir stringByAppendingPathComponent:@"data.dat"]; NSMutableArray *load = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; [array setArray:load]; |
4行目:ファイルパスを指定し、アンアーカイブしたオブジェクトを受け取る
5行目:(NSMutableArray *)arrayへ読み込んだデータをセット
アーカイブされたファイル
プログラム側からアーカイブ+保存したあとに、iOSシミュレータのサンドボックスを覗いてみました。
/Users/(user)/library/Application Support/iPhone Simulator/(version)/Applications/(app_UUID)/Documents/
上記ディレクトリにファイル”data.dat”として保存されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>$archiver</key> <string>NSKeyedArchiver</string> <key>$objects</key> <array> <string>$null</string> <dict> <key>$class</key> <dict> <key>CF$UID</key> <integer>5</integer> </dict> <key>NS.objects</key> <array> <dict> <key>CF$UID</key> <integer>2</integer> </dict> <dict> <key>CF$UID</key> <integer>3</integer> </dict> <dict> <key>CF$UID</key> <integer>4</integer> </dict> </array> </dict> <integer>2</integer> <integer>56</integer> <integer>97</integer> <dict> <key>$classes</key> <array> <string>NSMutableArray</string> <string>NSArray</string> <string>NSObject</string> </array> <key>$classname</key> <string>NSMutableArray</string> </dict> </array> <key>$top</key> <dict> <key>root</key> <dict> <key>CF$UID</key> <integer>1</integer> </dict> </dict> <key>$version</key> <integer>100000</integer> </dict> </plist> |
XMLで書かれていたので、ちょっと驚きました。解説書では「バイト列に変換する」と書かれていたので、てっきりバイナリーデータになっているのかと思っていました。
これならば、書き込みの検証も容易に出来ますね。
サンプルアプリ
cocos2dの図形の描画テストも兼ねて、コードを書いてみました。
バーグラフです。Addボタンを押すたびにデータ列にランダムな数が追加されていきます。
loadとsaveでファイルへの読み書きを行なっています。
コメントを残す
コメントを投稿するにはログインしてください。