2011-01-17 5 views
0

私はNodeというクラスを持っています。このクラスには、一連のパラメータとNSMutableArrayというサブノードがあります。 1つのプロセスはツリーのルートとして1つのNodeオブジェクトを作成し、サブノード配​​列を使用してノードの大きなツリーを作成します。このツリー全体を別のプロセスに渡す必要があるので、私はNSConnectionを設定します。Objective-C:オブジェクトのツリーをリモートの分散オブジェクトに渡す方法は?

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

通信自体は、ルート・ノードが呼び出されることを期待リモートメソッド「setNodeTree」を、動作します。ただし、ツリーの転送は機能しません。

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

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

    return nodeCopy; 
} 

しかし、クライアントは次の例外で終了:私は、NodeクラスのcopyWithZoneメソッドを実装する必要がありました

*** 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にはanyが含まれておらず、BOOLを期待または返すメソッドは使用されていません。

+0

あなたの 'subnodes'プロパティが' retain'または 'copy'の場合、' [nodeCopy setSubnodes:[[self subnodes] copyWithZone:zone]]; 'にインスタンスが漏れています。私は不適切に実装された 'copyWithZone:'の実装から、あらゆる種類の奇妙なエラーを受けました。 – Richard

+0

Ooops、ヒントのおかげで。それはそれを働かせようとすることから残ったものでした。 – blastar

答えて

0

2つの選択肢が考えられます。ツリー全体の

  • シリアライズとデシリアライズ、プロセス間の
  • 共有メモリ。

性能とコードの可読性については、私の好みは共有メモリです。参照開始はshmget(2) manual pageです。

+0

私は、ツリー全体をシリアライズして渡すことを試みましたが、例外は同じままです。共有メモリは、ツリーがどれだけ大きくなるかを常に事前に知っているわけではないので、問題があります。 – blastar

関連する問題