私のプロジェクトでは、対象のプラットフォームで 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
後に接続ハンドラにデリゲート メソッドを呼び出させる方法はありますか?