XCode / iOS: NSCoding - постоянство графов объектов с двумя массивами общих объектов - PullRequest
0 голосов
/ 14 марта 2011

У меня есть два класса, которые выглядят следующим образом в виде barebones:

@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

Вы заметите, что они, кажется, выражают одинаковое поведение - кодирование / декодирование NSMutableArray, содержимое которого является объектами типа GraphEdge, которыереализует NSCoding.Различие между классами на практике заключается в том, что GraphEdges создает ребра в своем свойстве edges, тогда как GraphNode добавляет к своим собственным edges только ссылки на уже существующие экземпляры GraphEdge в GraphEdges.edges.

Моя проблемачто при декодировании объектов GraphNode и GraphEdges граф объекта не поддерживается, поскольку каждый класс создает свои собственные версии исходных объектов GraphEdge, хранящихся в свойстве edges для каждого класса.

Я попытался выполнить encodeConditionalObject дляцелые ребра NSMutableArray * в GraphNode при сохранении безусловного кодирования в GraphEdges, но неудивительно, что это просто не в состоянии кодировать GraphNode.edges, поскольку условие помещается в сам массив, а не в его объекты.массивы в обоих случаях, и выполняют условное кодирование для каждого edges члена для GraphNode, но безусловное кодирование для каждого члена edges в GraphEdges?

Любой совет приветствуется, большое спасибо.

1 Ответ

1 голос
/ 14 марта 2011

Я думаю, что проблема в том, что вы архивируете объекты GraphNode и GraphEdges отдельно. Объедините все связанные объекты GraphNode и GraphEdges в каком-то контейнере, может быть, «Graph», чтобы они все стали частью одного и того же графа объектов. Я считаю, что NSKeyedArchiver будет архивировать каждый объект только один раз.

...