我最近创建了一个自定义框架,该框架计划重新用于多个项目。问题是,这是针对插件的,并且知道由于符号冲突和其他原因,我们不能简单地将框架嵌入到插件的捆绑包中,我正在考虑将其简单地嵌入到插件的XPC中。附带说明一下,此框架将用于启动自定义接口,例如视图控制器,视图,并使用一些内置于其中的委托(插件将必须拥有所有权)(我希望如此)。这让我想到了一个问题:另一个进程是否有可能获得XPC中实例化的对象的所有权?我对使用框架还很陌生,因此我花了数小时试图根据我在网上找到的教程在XCode中一起拼凑东西,可惜没有用。
答案 0 :(得分:0)
框架是一堆代码和资源,可以由多个应用程序使用和重用。它可以嵌入到您的应用程序中,可以作为操作系统的一部分(整个Cocoa实际上是框架的集合),也可以在运行时动态定位并以编程方式加载。加载后,框架的代码,类和资源在应用程序中显示,就好像它们已直接编译到宿主应用程序中一样。关键是代码可以直接在进程的内存空间中执行。
XPC 是进程间通信工具。它允许一个进程使用不同的进程发送和接收消息。它不能用于与自身通信。
您不能使用XPC来“拥有”对象。所有XPC消息都会序列化任何对象(在可可语中为“存档”),并在接收端反序列化该对象。现在的第二个过程是如何复制原始对象;它不是对原始对象的引用,并且受制于其过程的边界。
如果您的第二个进程需要显示某些内容,则(基本上)有三个选项:
(1)将第二个进程设为自己的应用程序。第二个过程可以是具有Windows等功能的成熟的Cocoa应用程序。您可以将其设为“附件”应用,因此它没有菜单栏或没有出现在扩展坞中。请参阅LSUIPresentationMode
Info.plist属性和/或NSApplication.activationPolicy
。
(2)先进的技术是使用IOSurface
。实际上,IOSurface
是一种方法,通过该方法,第二个进程(您的XPC服务)可以直接绘制到应用程序的窗口中。同样,绘图对象仍然存在,并且在第二个过程中是完全隔离的。但是它们绘制的内容将像本地视图对象一样显示在您的应用程序中。 (这就是Safari的工作方式;每个浏览器页面都是由孤立的后台进程绘制到表面中呈现的。)
(3)使用穷人的IOSurface
:将您的数据发送到第二个进程,让其将结果呈现为可以序列化和绘制的内容(像素数组,TIFF,PNG等)主机应用程序,然后使用XPC将渲染的图像发送回主机应用程序进行显示。