在我的项目中,我使用基于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中的连接,并让连接处理程序在取消后调用委托方法?

最佳答案

您应该能够将事件处理程序更改为指向事件处理程序,该事件处理程序仅用于观察连接是否关闭。您可以将挂起的连接放入另一个对象(可能是全局对象或静态对象)中,也可以仅假设由于该连接被取消而调用了调用此单独事件处理程序的任何连接(当然请检查事件类型)。

关于ios - 取消处理程序引用self时,取消-dealloc中的XPC连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17499038/

10-12 00:19
查看更多