4

を拡張するカスタム クラスがありますNSString。を使用して(ドラッグ/ドロップ用に)シリアル化しようとしていNSKeyedArchiverます。...Coderクラスはメソッドをオーバーライドします。

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        data = [[aDecoder decodeObjectForKey:@"data"] copy];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:self.data forKey:@"data"];
}

しかし、実際にアーカイブ/アーカイブ解除を実行しようとすると:

MyClass *object = [[MyClass alloc] init];
[pboard setData:[NSKeyedArchiver archivedDataWithRootObject:object] forType:SACP_WRAPPER_DRAG_TYPE];
NSLog(@"Wrote data for class %@", [object class]);

...

id item = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:SACP_WRAPPER_DRAG_TYPE]];
NSLog(@"Read data for class %@", [item class]);

出力は私が期待しているものではありません:

2011-10-15 18:56:22.898 MyApp[7402:707] Wrote data for class ASCIIString
2011-10-15 18:56:23.345 MyApp[7402:707] Read data for class __NSCFString
4

1 に答える 1

5

NSString はクラス clusterです:

「NSString はクラス クラスタであり、NSNumber や NSArray などの他の Foundation タイプと同様です。

クラス クラスタは、Foundation フレームワークが広範囲に使用する設計パターンです。クラス クラスタは、公開された抽象スーパークラスの下に、多数の非公開の具体的なサブクラスをグループ化します。このようにクラスをグループ化することで、オブジェクト指向フレームワークの機能の豊富さを損なうことなく、一般に公開されているアーキテクチャを簡素化できます。クラス クラスタは、「Cocoa デザイン パターン」で説明した Abstract Factory デザイン パターンに基づいています。"

NSString docの「Subclassing Notes」を必ず読んでください。サブクラスのカスタム ストレージ メカニズムを実装する必要があります。私の推測では、これを行っていないか、そうしている場合でも、 NSString が参照する特定のプライベート クラスsuperのメソッドを使用するため、 で NSCoding メソッドを呼び出すと、これらのプライベート クラスがポップアップ表示されます(その内容によります)。super

于 2011-10-16T00:07:26.357 に答える