2013-07-06 71 views
0

在我的項目中,我使用的是基於C的XPC API,因爲NSXPCConnection在我所針對的平臺上不可用。目前我使用弱引用,以防止連接處理器塊從保留self,如下:取消處理程序引用自我時取消-dealloc中的XPC連接

__block VTVoltControllerProxy *proxy = self; 

xpc_connection_set_event_handler(_connection, ^(xpc_object_t object) { 
    xpc_type_t type = xpc_get_type(object); 

    ... 

    if (type == XPC_TYPE_ERROR && object == XPC_ERROR_CONNECTION_INVALID) { 
     if ([[proxy delegate] respondsToSelector:@selector(voltControllerDidDisconnectFromHost:)]) { 
      [[proxy delegate] voltControllerDidDisconnectFromHost:proxy]; 
     } 
    } 
}); 

然而,只要連接在-dealloc方法我班內取消引入一個問題:

- (void)dealloc 
{ 
    ... 

    xpc_connection_cancel(_connection); 
    xpc_release(_connection); 

    ... 
} 

由於取消XPC連接是異步操作,因此在類實例已被釋放後調用連接處理程序,導致proxy指向不再存在的對象。

有沒有一種方法可以安全地取消-dealloc中的連接,並讓連接處理程序在取消後調用委託方法?

回答

1

您應該能夠將事件處理程序更改爲指向僅用於觀察連接關閉的事件處理程序。您可以將掛起的連接排列在另一個對象(可能是全局或靜態)中,或者假設調用這個單獨事件處理程序的任何連接被調用,因爲它被取消(檢查課程的事件類型)。

0

今天遇到同樣的問題。我不知道你是否已經解決這個問題。但是,如果在繼續之前dealloc等待XPC連接關閉,該怎麼辦?

可以引入條件變量來實現此行爲。但是我想知道它可能帶來什麼缺點。