3

encodeObject:NSCoderでは、とを呼び出すことができますencodeObject:forkey:。そして、これは多くのデータ型に当てはまります。それらの呼び出しの違いは何ですか?それらの使い方は?なぜまたはがないの ですencodeDataObject:forkey:encodePropertyList:forKey:

4

1 に答える 1

3

キー付きアクセサーとキーなしアクセサー

ほとんどの場合、メソッドを呼び出して、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:呼び出しはありません。そのため、通常の を使用してエンコードできます。同じことがプロパティ リストにも当てはまります。プロパティ リストは単なる辞書であり、辞書は を使用してエンコードできる通常のオブジェクトです。NSDataNSCodingencodeObject:encodeObject:

おそらく混乱させたのは、BOOLまたはのようなプリミティブ型をエンコードするための特殊なメソッドの数ですNSUInteger。これらは型システムに関係しています。オブジェクトをエンコードおよびデコードする場合、インターフェイスは型を使用できid、特定のオブジェクト型に関係なく機能します。

// can pass NSObject*, NSData*, any object
- (void) encodeObject: (id) anObject {…}
- (id) decodeObject {…}

プリミティブ型にはそのような一般的な「ワイルドカード」型がないため、特殊なゲッターとセッターの数は次のようになります。

- (void) encodeBool: (BOOL) flag {…}
- (BOOL) decodeBool {…}

理論的には使用してキャストできますがvoid*、それは扱いにくく、エンコード インターフェイスはエンコードするオブジェクトのサイズを認識しません。

于 2012-11-14T17:14:04.367 に答える