通过NSXPCConnection传递xpc_object_t

时间:2012-12-31 15:47:02

标签: objective-c foundation xpc nsxpcconnection

我是XPC服务编程的新手,我正在尝试将在XPC服务中创建的IOSurface共享给主机应用程序。我可以使用NSXPCConnection API设置一个简单的主机和服务,现在我想我应该使用这两种方法(在IOSurfaceAPI.h中找到)将IOSurface传递给主机:

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

有没有办法可以使用NSXPCConnection API传递xpc_object_t,还是应该使用C API(如xpc.h中所定义)?

1 个答案:

答案 0 :(得分:2)

好问题。 The "Daemons and Services Programming Guide"声明XPC代理方法只能处理以下数据类型:

  • 算术类型(int,char,float,double,uint64_t,NSUInteger等)
  • BOOL
  • C字符串
  • 仅包含上面列出的类型的C结构和数组
  • 实现NSSecureCoding协议的Objective-C对象

xpc_object_t只是void *的typedef,所以它不符合任何这些标准,而且我没有看到任何方法将它包装在其中。 (尝试将其转换为数据,或将其转换为适当大小的int,将无效。)

另一方面,在10.8上,xpc_object_t也足以使用ARC保留/释放Objective-C对象,以添加到Objective-C集合等。

尝试在你的协议上传递xpc_object_t就好了,只是为了看看Apple是否留下了无证漏洞。试试吧!

否则,较低级别的XPC API肯定会起作用:

 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);