2014-03-01 63 views
2

我設置上下文的類的創建這樣的插座地址:在我把這個回調轉換CFSocket上下文指針

CFSocketContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    self.sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack|kCFSocketConnectCallBack, *(CFSocketCallBack)takeCallback, &ctxt); 

然後:

static void takeCallback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info) 
{ 

PUFTransCont* obj = (__bridge PUFTransCont *)(info); 

} 

我看到蘋果這樣做的示例代碼,並在整個互聯網上看到樣本。爲什麼當我做到這一點時,它不起作用。每當執行打

PUFTransCont* obj = (__bridge PUFTransCont *)(info); 

我得到一個EXC_BAD_ACCESS

回答

4

您的代碼看起來不錯,但你必須確保,因爲它使用的回調函數PUFTransCont對象不只要釋放

一個可能的解決方案是在使用套接字 (假設您使用ARC進行編譯)時保持對象的強引用。

另一種可能的解決方案是用轉移所有權

CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL}; 

(這增加了保留對象的計數),並在回調與當不再需要 對象後釋放它,例如

CFRelease(info); 
+0

它在回調發生之前被釋放。我解決了這個問題。 – Paulpjmmchugh