3

我是 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 中定义)?

4

1 回答 1

2

好问题。“守护进程和服务编程指南”指出 XPC 代理方法只能处理以下数据类型:

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

xpc_object_t只是一个 typedef for void *,所以它不符合任何这些标准,我看不出有任何方法可以将它包装在符合要求的东西中。(尝试将其转换为数据,或将其转换为适当大小的 int 是行不通的。)

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

尝试通过你的协议很容易xpc_object_t,只是看看苹果是否留下了一个未记录的漏洞。试试看!

否则,较低级别的 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);
于 2013-01-01T00:13:13.220 回答