Цель-C: Как передать дерево объектов в удаленный распределенный объект? - PullRequest
0 голосов
/ 17 января 2011

У меня есть класс с именем Node, который содержит набор параметров и NSMutableArray с именем subNodes. Один процесс создает один объект Node в качестве корня дерева и использует массивы subNodes для создания большого дерева узлов. Все это дерево должно быть передано другому процессу, поэтому я настроил NSConnection:

Node *tree;
// ...create Node-Tree...
NSConnection *otherProcess = [NSConnection connectionWithRegisteredName:@"MyApp"
                                           host:nil];
MyObj *remoteObj = (MyObj*) [[otherProcess rootProxy] retain];
[remoteObj setNodeTree:tree];

Само соединение работает, удаленный метод 'setNodeTree', который ожидает, что будет вызван корневой узел. Однако перенос дерева не работает. Мне пришлось реализовать метод copyWithZone для класса Node:

-(id)copyWithZone:(NSZone*)zone
{
  Node *nodeCopy = [[[self class] allocWithZone:zone] init];

  [nodeCopy setSize:[self size]];
  [nodeCopy setSubnodes:[[self subnodes] copyWithZone:zone]];

  return nodeCopy;
}

Но клиент завершает работу со следующим исключением:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: '[NOTE: this exception originated in the server.]
Cannot create BOOL from object <Node: 0x10018f640> of class NSDistantObject'
*** Call stack at first throw:
(
  0  CoreFoundation   0x00007fff81f687b4 __exceptionPreprocess + 180
  1  libobjc.A.dylib  0x00007fff823a80f3 objc_exception_throw + 45
  2  Foundation       0x00007fff8831e0c3 -[NSConnection sendInvocation:internal:] + 4304
  3  CoreFoundation   0x00007fff81f3a98c ___forwarding___ + 860
  4  CoreFoundation   0x00007fff81f36a68 _CF_forwarding_prep_0 + 232
  5  MyProgram        0x00000001000015d5 main + 260
  6  MyProgram        0x0000000100000fa8 start + 52
  7  ???              0x0000000000000002 0x0 + 2
)
terminate called after throwing an instance of 'NSException'

Есть идеи, что здесь пошло не так? Очевидно, что где-то ожидается переменная BOOL, но Node не содержит ее, и нет метода, который ожидает или возвращает BOOL.

1 Ответ

0 голосов
/ 17 января 2011

Возможны две альтернативы:

  • сериализация и десериализация всего дерева,
  • общая память между процессами.

Что касается производительности и читабельности кода, я предпочитаю разделенную память. Ссылка начала страница руководства shmget (2) .

...