在我的项目中,我使用基于 C 的 XPC API,因为 NSXPCConnection 在我的目标平台上不可用。目前我使用弱引用来防止连接处理程序块保留self
,如下:
__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
并让连接处理程序在取消后调用委托方法?