3

XPCサービスプログラミングは初めてで、XPCサービスで作成されたIOSurfaceをホストアプリケーションと共有しようとしています。NSXPCConnection APIを使用して単純なホストとサービスをセットアップできます。次に、IOSurfaceをホストに渡すために次の2つのメソッド( IOSurfaceAPI.hにあります)を使用することになっていると思います。

IOSurfaceRef IOSurfaceLookupFromXPCObject(xpc_object_t xobj);
xpc_object_t IOSurfaceCreateXPCObject(IOSurfaceRef aSurface);

NSXPCConnection APIを使用してxpc_object_tを渡す方法はありますか、またはC API(xpc.hで定義されている)を使用する必要がありますか?

4

1 に答える 1

2

良い質問。「デーモンおよびサービスプログラミングガイド」には、XPCプロキシメソッドは次のデータ型のみを処理できると記載されています。

  • 算術型(int、char、float、double、uint64_t、NSUIntegerなど)
  • BOOL
  • C文字列
  • 上記のタイプのみを含むC構造体と配列
  • NSSecureCodingプロトコルを実装するObjective-Cオブジェクト

xpc_object_tはのtypedefにすぎvoid *ないため、これらの基準のいずれも満たしていません。また、これを行うものでラップする方法がわかりません。(データに変換しようとしたり、適切なサイズのintにキャストしようとしても、機能しません。)

一方、10.8では、xpc_object_tARCで保持/解放したり、Objective-Cコレクションに追加したりするのに十分なObjective-Cオブジェクトもあります。

xpc_object_tAppleが文書化されていない抜け穴を残したかどうかを確認するためだけに、プロトコルを渡してみるのは簡単です。それを試してみてください!

それ以外の場合、低レベルのXPCAPIは確実に機能します。

 xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
 xpc_object_t xpcSurface = IOSurfaceCreateXPCObject(aSurface);
 xpc_dictionary_set_value(message, "surface", xpcSurface);
 xpc_connection_send_message(connection, message);
于 2013-01-01T00:13:13.220 に答える