Отмена подключения XPC в -dealloc, когда обработчик отмены ссылается на себя

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


person ProtoSphere    schedule 06.07.2013    source источник


Ответы (2)


Вы должны иметь возможность изменить обработчик событий, чтобы он указывал на обработчик событий, который используется только для наблюдения за закрытием соединения. Вы можете либо поставить ожидающие соединения в очередь в другом объекте (возможно, глобальном или статическом), либо просто сделать предположение, что любое соединение, вызывающее этот отдельный обработчик событий, вызывается, потому что оно отменяется (конечно, проверьте тип события).

person gaige    schedule 06.07.2013

Сегодня столкнулся с той же проблемой. Я не знаю, вы уже решили это или нет. Но что, если Dealloc ждет закрытия соединения XPC, прежде чем продолжить.

Для достижения такого поведения можно ввести условную переменную. Но мне интересно, какой недостаток это может принести.

person Negative Zero    schedule 16.04.2015