我是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中所定义)?
答案 0 :(得分:2)
好问题。 The "Daemons and Services Programming Guide"声明XPC代理方法只能处理以下数据类型:
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);