0

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

4

2 回答 2

1

您应该能够将事件处理程序更改为指向仅用于观察连接关闭的事件处理程序。您可以在另一个对象(可能是全局或静态)中将挂起的连接排队,或者只是假设调用此单独事件处理程序的任何连接都被调用,因为它正在被取消(当然检查事件类型)。

于 2013-07-06T11:40:14.880 回答
0

今天遇到同样的问题。我不知道你是否已经解决了这个问题。但是如果 dealloc 在继续之前等待 XPC 连接关闭怎么办。

可以引入条件变量来实现此行为。但我想知道它会带来什么缺点。

于 2015-04-16T20:50:27.980 回答