0

私のプロジェクトでは、対象のプラットフォームで NSXPCConnection を使用できないため、C ベースの XPC API を使用しています。現在、次のように、弱参照を使用して、接続ハンドラー ブロックが を保持しない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 に答える