ios - 当取消处理程序引用 self 时,在 -dealloc 中取消 XPC 连接

标签 ios objective-c macos xpc

在我的项目中,我使用基于 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/

相关文章:

ios - 如何从 ios 中的静态库中获取 .m 文件

ios - 隐藏导航栏的 View 中的交互式弹出手势?

ios - 读取字典元素的预期方法在 'id<NSFastEnumeration,NSObject>' 类型的对象上找不到

macos - 如何取消映射 Sublime Text 键绑定(bind),以便发生标准的os操作?

objective-c - 在 10.6 下调用 Finder 的 Scripting Bridge 返回值不正确(但不会引发错误)

ios - 在App Purchase中可以正常使用,但是付款成功后我无法更改UIButton图像

iOS - 处理指向已释放变量的异步任务

python - 导入安装工具失败

ios - 如何获取 PHAsset 的文件大小?

ios - 在代码中使用静态单元格重新排序 UITableview