0

ベアボーン形式で次のような 2 つのクラスがあります。

@interface GraphNode {
    NSMutableArray *edges;
}

@implementation GraphNode

-(id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        edges = [coder decodeObjectForKey:@"edges"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:edges forKey:@"edges"];
}

@end

@interface GraphEdges {
  NSMutableArray *edges;
}

@implementation GraphEdges

-(id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        edges = [coder decodeObjectForKey:@"edges"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:edges forKey:@"edges"];
}

@end

NSCoding を実装するタイプ GraphEdge のオブジェクトである NSMutableArray をエンコード/デコードするという同じ動作を表現しているように見えることに気付くでしょう。実際のクラスの違いは、GraphEdges がそのプロパティでエッジを作成するのに対し、GraphNode はGraphEdges.edges の既存の GraphEdge インスタンスへの参照のみをedges独自に追加することです。edges

edges私の問題は、各クラスが各クラスのプロパティに格納されている元の GraphEdge オブジェクトの独自のバージョンを作成するため、GraphNode および GraphEdges オブジェクトをデコードするときにオブジェクト グラフが維持されないことです。

GraphEdgesのエンコードを無条件に保ちながら、GraphNodeのNSMutableArray *edges全体でencodeConditionalObjectを実行しようとしましたが、当然のことながら、条件はオブジェクトではなく配列自体に配置されるため、これは単にGraphNode.edgesのエンコードに失敗します。

どちらの場合も配列を反復処理し、GraphNode の各メンバーに対して条件付きエンコーディングを実行しますedgesが、GraphEdges の各メンバーに対して無条件エンコーディングを実行するソリューションはedgesありますか?

アドバイスをいただければ幸いです。

4

1 に答える 1

1

ここでの問題は、GraphNode オブジェクトと GraphEdges オブジェクトを別々にアーカイブしていることだと思います。関連するすべての GraphNode および GraphEdges オブジェクトをある種のコンテナー (おそらく「Graph」) に結合して、それらがすべて同じオブジェクト グラフの一部になるようにします。NSKeyedArchiver は各オブジェクトを 1 回だけアーカイブすると思います。

于 2011-03-14T16:31:04.870 に答える