В моем проекте я использую XPC API на основе C, поскольку 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
и заставить обработчик соединения вызывать метод делегата после отмены?