encodeObject:
NSCoderでは、とを呼び出すことができますencodeObject:forkey:
。そして、これは多くのデータ型に当てはまります。それらの呼び出しの違いは何ですか?それらの使い方は?なぜまたはがないの ですencodeDataObject:forkey:
かencodePropertyList:forKey:
?
1 に答える
キー付きアクセサーとキーなしアクセサー
ほとんどの場合、メソッドを呼び出して、encodeSomething:forKey:
後でデコーダーから値を取得するために使用するキーを指定するだけです。
- (void) encodeWithCoder: (NSCoder*) coder
{
[coder encodeObject:someProperty forKey:@"someProperty"];
}
- (id) initWithCoder: (NSCoder*) decoder
{
self = [super init];
if (self) {
[self setSomeProperty:[decoder decodeObjectForKey:@"someProperty"]];
}
return self;
}
呼び出しのキーなしバージョンは古いです。10.2 より前では、シリアライゼーションの動作が異なっていたと思います。
特殊なオブジェクト アクセサー
に準拠しているため、別のencodeDataObject:
呼び出しはありません。そのため、通常の を使用してエンコードできます。同じことがプロパティ リストにも当てはまります。プロパティ リストは単なる辞書であり、辞書は を使用してエンコードできる通常のオブジェクトです。NSData
NSCoding
encodeObject:
encodeObject:
おそらく混乱させたのは、BOOL
またはのようなプリミティブ型をエンコードするための特殊なメソッドの数ですNSUInteger
。これらは型システムに関係しています。オブジェクトをエンコードおよびデコードする場合、インターフェイスは型を使用できid
、特定のオブジェクト型に関係なく機能します。
// can pass NSObject*, NSData*, any object
- (void) encodeObject: (id) anObject {…}
- (id) decodeObject {…}
プリミティブ型にはそのような一般的な「ワイルドカード」型がないため、特殊なゲッターとセッターの数は次のようになります。
- (void) encodeBool: (BOOL) flag {…}
- (BOOL) decodeBool {…}
理論的には使用してキャストできますがvoid*
、それは扱いにくく、エンコード インターフェイスはエンコードするオブジェクトのサイズを認識しません。