Foundation(アーカイブ)

2010. 04. 10
iPhone SDKプログラミング大全』本文に記述があるわけではありませんが、メソッドの解説の中で出てくる用語を説明しなければならないので、軽く紹介します。

・アーカイブ(archive)
オブジェクトをバイト列に変換することで、エンコーディングするとも言います。

・アンアーカイブ(unarchive)
バイト列を元のオブジェクトに変換することで、デコードする、復元するとも言います。

・バイト列(bytes)
バイト列に関しては当サイトの『バイト列』を参照してください。

アーカイブ/アンアーカイブは、単純なテキストや単体の画像・音楽ファイルに限らず、複数のオブジェクトをその相互関係も含めて処理することもできます。

・オブジェクトグラフ(object graph)
グラフ理論(Graph theory)についての詳細は『Wikipedia/グラフ理論』を参照願います。
ここでは、あるオブジェクトがインスタンス変数で他のオブジェクトを参照している関係を図示したものをオブジェクトグラフとします。

・ルートオブジェクト(root object)
オブジェクトの相互参照を図示したオブジェクトグラフにおいて、参照の起点となるオブジェクトのこと。

何かを説明しようとすると大抵出てきますが、『詳解 Objective-C 2.0』のアーカイブの項目が詳しいです。
iPhoneアプリ作る上でObjective-Cは必修ですから、買って損はない・・・というより必携です。
頭から読んだ方がいいとは思いますが、『分からないメソッドが出てきたら調べる』という使い方もできます。
オフィシャルの英文直訳で意味不明な事項も、荻原さんが平易な日本語で説明されています。


●アーカイブのクラス図

Foundation
NSCoderNSKeyedArchiver
NSKeyedUnarchiver
NSPropertyListSerialization

FoundationCore Foundation
NSDataNSMutableDataCFDataCFMutableData


●配列のアーカイブ/アンアーカイブ

// 配列の作成
NSArray *ptArray = [NSArray arrayWithObjects:@"ゆきぽ", @"あふぅ", @"ちひゃー", nil];

// 配列オブジェクトをアーカイブ
NSData *ptData = [NSKeyedArchiver archivedDataWithRootObject:ptArray];

// データをアンアーカイブ
NSArray *unPtArray = [NSKeyedUnarchiver unarchiveObjectWithData:ptData];
NSLog([NSString stringWithFormat:@"%@, %@, %@", [unPtArray objectAtIndex:0], [unPtArray objectAtIndex:1], [unPtArray objectAtIndex:2]]);
//    ゆきぽ, あふぅ, ちひゃー


・archivedDataWithRootObject:

+ (NSData *)archivedDataWithRootObject:(id)rootObject

指定したオブジェクトグラフのルートオブジェクトをエンコード(アーカイブ)し、NSDataオブジェクトにして返します
アーカイブのフォーマットはNSPropertyListBinaryFormat_v1_0で定義されています

rootObject:アーカイブするオブジェクトグラフのルートオブジェクトを指定します


・unarchiveObjectWithData:

+ (id)unarchiveObjectWithData:(NSData *)data

NSKeyedArchiverで格納された、エンコードされているオブジェクトグラフをデコードして返します
デコードできなかった場合はNSInvalidArchiveOperationExceptionを発生させます

data:NSKeyedArchiverでエンコードされたオブジェクトグラフを指定します


NSPropertyListBinaryFormat_v1_0はNSPropertyList.hで定義されている、プロパティリストをバイナリ形式に変換するフォーマットのキーで、アーカイブ/アンアーカイブする際の形式判別に用いられます

enum {
    NSPropertyListOpenStepFormat = kCFPropertyListOpenStepFormat,
    NSPropertyListXMLFormat_v1_0 = kCFPropertyListXMLFormat_v1_0,
    NSPropertyListBinaryFormat_v1_0 = kCFPropertyListBinaryFormat_v1_0
};
typedef NSUInteger NSPropertyListFormat;

kCFPropertyListBinaryFormat_v1_0はCFPropertyList.hで定義されています

enum {
    kCFPropertyListOpenStepFormat = 1,
    kCFPropertyListXMLFormat_v1_0 = 100,
    kCFPropertyListBinaryFormat_v1_0 = 200
};
typedef CFIndex CFPropertyListFormat;


●NSCodingプロトコル

アーカイブ/アンアーカイブは全てのオブジェクトを処理できるわけではなく、NSCodingプロトコルに準拠したものでなければなりません。

NSCodingプロトコルについては、『詳解 Objective-C 2.0』では厳しかったので、『Repeating Motif Wonderland/アーカイブ』を参照しました。

プロトコルについては『Objective-C言語のメモ書き(4)』を参照していただくとして、NSCodingプロトコルの話をしますと、オブジェクトのどのデータをアーカイブ/アンアーカイブするかという指示を出すルールを定めたものです。

NSCodingプロトコルはNSObject.hで定義されています。

@protocol NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

@end

encodeWithCoder:はアーカイブするデータを定義するメソッド、initWithCoder:はアーカイブされているデータをアンアーカイブしてデータを復元するメソッドです。

上記のサンプルコードで記述が無かったのは、NSArrayを始め、Foundationフレームワークの多くのクラス(NSStringやNSDictionary)がNSCodingに既に準拠しているから不要だったためです。
(各クラスリファレンスの冒頭に『Conforms to(準拠する)』となっているクラスにNSCordingが入っていれば準拠しており、Instance MethodsでencodeWithCoder:とinitWithCoder:が有ります)


- (void)encodeWithCoder:(NSCoder *)encoder
{
    // インスタンス変数をアーカイブ
    [encoder encodeInt:_age forKey:@"age"];
    [encoder encodeObject:_name forKey:@"name"];
    [encoder encodeBool:_male forKey:@"male"];
}


・encodeWithCoder:

- (void)encodeWithCoder:(NSCoder *)encoder

指定したアーカイバでレシーバをエンコード(アーカイブ)します

encoder:アーカイバオブジェクト(アーカーブするNSCoderのインスタンス)を指定します


・encodeInt:forKey:

- (void)encodeInt:(int)intv forKey:(NSString *)key

エンコードするint値と関連付けするキーを指定します

intv:エンコードするint値を指定します
key:int値に関連付けるキーを指定します(nilは指定できません)


・encodeObject:forKey:

- (void)encodeObject:(id)objv forKey:(NSString *)key

エンコードするオブジェクトと関連付けするキーを指定します

objv:エンコードするオブジェクトを指定します(nilは指定できません)
key:オブジェクトに関連付けるキーを指定します(nilは指定できません)


・encodeBool:forKey:

- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key

エンコードするブール値と関連付けするキーを指定します

boolv:エンコードするブール値を指定します
key:ブール値に関連付けるキーを指定します(nilは指定できません)


- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if (!self) {
        return nil;
    }

    // インスタンス変数をアンアーカイブ
    _age = [decoder decodeIntForKey:@"age"];
    _name = [[decoder decodeObjectForKey:@"name"] retain];
    _male = [decoder decodeBoolForKey:@"male"];

    return self;
}


・initWithCoder:

- (id)initWithCoder:(NSCoder *)decoder

指定したアンアーカイバの中のデータから、初期化したオブジェクトを返します

decoder:アンアーカイバオブジェクトを指定します


・decodeIntForKey:

- (int)decodeIntForKey:(NSString *)key

指定したキーと関連付けされているint値をデコードします
keyに関連付けされているものが無ければ0を返します

アーカイブのint値が異なるサイズだった場合は矯正されますが、値が大き過ぎてデフォルトのサイズを超える場合はNSRangeExceptionを発生させます

key:現在のアーカイブの中でデコード範囲内にあるキーを指定します(nilは指定できません)


・decodeObjectForKey:

- (id)decodeObjectForKey:(NSString *)key

指定したキーと関連付けされているオブジェクトをデコードして返します
keyに関連付けされているものが無い、またはnilの場合はnilを返します

key:現在のアーカイブの中でデコード範囲内にあるキーを指定します(nilは指定できません)


・decodeBoolForKey:

- (BOOL)decodeBoolForKey:(NSString *)key

指定したキーと関連付けされているブール値をデコードします
keyに関連付けされているものが無ければNOを返します

key:現在のアーカイブの中でデコード範囲内にあるキーを指定します(nilは指定できません)



参考文献

NSKeyedArchiver Class Reference

NSKeyedUnarchiver Class Reference

NSPropertyListSerialization Class Reference

NSCoding Protocol Reference

Repeating Motif Wonderland/アーカイブ

Wikipedia/グラフ理論

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






コンパニオン20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 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 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

コンパニオン20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR