将指向对象的指针传递到子应用程序

时间:2010-07-21 14:28:14

标签: objective-c pointers object shared-memory

A tiny pointer problem :)

基本上,我有两个应用程序。 应用1 启动应用2 ,但它仍保留在内存中。当应用程序2 启动时,需要为其指定一个存储在第一个应用程序中的 CALayer 对象。指针所代表的对象需要由两个应用程序访问。我正在使用 Objective-C 。我真的很感激任何例子

我需要更多跨平台的东西,分布式对象特定于 Mac OS X 。并不是我不知道CALayer是Mac特定的(因为iOS 而非常好)。我知道非常好,只是我想使用跨平台解决方案而不是特定的解决方案。

4 个答案:

答案 0 :(得分:2)

您将无法跨应用程序边界传递指针,因为进程将具有不同的地址空间。如果需要引用该对象并对其启动操作,则需要使用分布式对象系统或其他进程间通信层。

我得到的印象是你想要生成子进程,让它更新一些共享数据结构,然后退出。一种可能性是使用共享内存系统,例如mmap (2)System V shared memory。不幸的是,便携式共享内存在Windows和Unix / Linux上实现起来有点困难,你可能不得不制作一些特定于平台的包装器。 This MSDN article应该在Windows上为类似mmap的工具提供启动,但我从来没有在这个平台上完成共享内存,所以我无法保证任何细节。

另一种可能性是序列化对象并使用管道或其他机制在进程之间传递序列化数据结构。再说一遍,这样可以轻松地做到这一点有点令人担忧,因为Unix和Windows上的IPC工作方式完全不同。

请注意,对于共享内存,必须在共享内存池中初始化该对象,这意味着必须首先分配该对象。否则,您将需要显式地将数据复制到共享池中。如果数据结构中有任何指针,则此移动将破坏指针。

后一点也意味着如果您打算在共享数据结构中跟踪指针,则父ahd子进程还需要将共享内存映射到同一虚拟地址。如果您需要数据结构中的引用,则替代方法是将它们实现为句柄或基础的偏移量。这将使构建数据结构的代码变得复杂,因此映射到同一地址以便您可以使用指针获胜。

如果您决定使用此文件,还可以开启用于mmap的文件的安全性。

答案 1 :(得分:1)

在Mac OS X中使用distribute object,使用分发对象概念,您可以在Application1和Aplication2之间共享CALayer对象

答案 2 :(得分:0)

没有可移植(跨平台)方法来传递进程(应用程序)之间的指针。从容量上讲,这些进程可以使用网络连接或文件来交换对象的序列化。

答案 3 :(得分:0)

在应用程序之间共享数据的便携方式是使用进程间通信。在这种情况下,这是共享内存。 POSIX和System V API都可以在Mac OS X上使用。

可以在通知概述文档的Alternatives to Notifications部分找到一些链接。