2012-01-24 20 views
1

私はプロセス間通信にCFMessagePortRefを使用しています。データを受信するために、私はこの方法c関数からココア(目的c)関数へデータを取得する方法

CFDataRef didReceiveDataFromOtherProcess(CFMessagePortRef local,SInt32 msgid,CFDataRef data,void *info)

をコールバックしている今、私は私のメインコントローラに受信したデータを送信したいです。 didReceiveDataFromOtherProcessにメインコントローラーオブジェクトを作成してメインコントローラーにデータを送ることができますが、モジュールを渡すメッセージを一般化したいと思います。私はコールバック関数でインスタンス変数にアクセスすることができません、代理人はこの場合は動作しませんので、私は-(void)saveObject:(id)objectメソッドを定義し、グローバル変数にメインコントローラのオブジェクトを保存します。

messagePassing *object = [[messagePassing alloc]init]; 
[object saveObject:self]; //in main controller 

//in messagePassing 
-(void)saveObject:(id)object 
{ 
globalObject = object; 
} 

CFDataRef didReceiveDataFromOtherProcess(CFMessagePortRef local,SInt32 msgid,CFDataRef data,void *info) 
{ 
//.... 
[globalObject didReceivedData:(id)data]; // sending to main controller 
} 

ただし、この場合、 2つの接続を開くと、グローバルオブジェクトが変更されます。
誰でもお手伝いできますか?

答えて

1

これはinfoの対象です。コールバックを設定するときにinfoポインターとしてselfを渡します。その後、元のオブジェクトと通信できるようにコールバックで逆参照します。

メモリ管理には注意してください。 selfがコールバックの前に割り当て解除されると、割り当てを解除するとクラッシュします。 deallocでコールバック登録が削除されていることを確認してください。

関連する問題