在我的項目中,我使用的是基於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
中的連接,並讓連接處理程序在取消後調用委託方法?