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

Posted

技术标签:

【中文标题】当取消处理程序引用自身时,在 -dealloc 中取消 XPC 连接【英文标题】:Cancelling XPC connection in -dealloc when cancellation handler references self 【发布时间】:2013-07-06 02:21:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于当取消处理程序引用自身时,在 -dealloc 中取消 XPC 连接的主要内容,如果未能解决你的问题,请参考以下文章

当我返回其引用时,如果超出范围,静态 std::vector 将取消

在处理具有不同结构的相同数据集时避免取消引用

如何在 iOS 中取消完成处理程序

在 C 中取消引用指向 0 的指针

通过取消引用 NULL 指针来分配引用

当后台服务取消暂停或重新启动时,iOS 应用程序需要多长时间?