2012-01-24 39 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中的回撥註冊,以免發生這種情況。