在我的项目中,我使用基于 C 的 XPC API,因为 NSXPCConnection 在我的目标平台上不可用。目前,我使用弱引用来防止连接处理程序 block 保留 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
中的连接,并让连接处理程序在取消后调用委托(delegate)方法?
最佳答案
您应该能够更改事件处理程序以指向仅用于监视连接关闭的事件处理程序。您可以将挂起的连接放入另一个对象(可能是全局的或静态的)中,或者只是假设调用此单独事件处理程序的任何连接正在被调用,因为它正在被取消(当然检查事件类型)。
关于ios - 当取消处理程序引用 self 时,在 -dealloc 中取消 XPC 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499038/