2012-01-24 42 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 
} 

但在这种情况下,如果我打开两个连接,它会改变我的全局对象。
任何人都可以请帮我吗?

回答

1

这是info的用途。当您设置回调时,通过self作为info指针。然后在回调中对其进行解引用,以便可以与原始对象进行通信。

请注意内存管理。如果self在回调之前解除分配,则在您释放时会崩溃。请务必删除dealloc中的回拨注册,以免发生这种情况。