从NSXPCConnection传递非null参数时未调用应用程序回复

时间:2014-06-19 14:34:02

标签: macos nsimage xpc nsxpcconnection

我正在使用XPC将项目分成两个项目 - 一个为os x @ 64-bit构建的主项目,以及一个为os x @ 32-bit构建的XPC服务,因为它正在使用一个库不适用于32位且无法替换。两者使用NSXPCConnection进行通信。

我遇到从服务到主应用程序的回调问题:
当回复采用复杂的参数(即:一个类为nsimage或nsdata)时,是否从xpc服务中回调。没有错误或异常,没有任何反应。这有时也会以另一种方式发生,即在调用代理对象时。它不是随机发生的,它仅适用于某些回复签名,但我不确定是哪个。

我需要在xpc服务和主应用程序之间以某种方式传递nsimage。我尝试传递NSImage和NSData,但没有调用回复(值得一提 - 它是在传递nil而不是真实对象时调用的。)

我尝试使用[NSData bytes]发送指针,然后使用[NSData initWithData:length:]重新创建数据。当我尝试这个时,调用了回复,但是在调用initWithData时我得到了一个EXC_BAD_ACCESS。我认为这是因为32位和64位寻址之间存在一些混乱。

一些代码示例:

当回复采用nsimage时:

导出界面

- (void)getImageWithReply:(void (^)(NSImage *image))reply;
来自的

回复:

- (void)getImageReply:(void (^)(NSImage *image))reply
{
    //We always re-render. The responsibility to not re-render when not needed will be passed on.
     [self render]; //updates puts in local var mRenderBuffer the render data
     reply(nil, NO);
     NSImage *image = ... //init image. it is being inited correctly, i know that
     reply(image);

}'

当回复将ptr带到数据时:

导出界面

typedef long long XPC_PTR; //As void* has different sizes in 32/64bit env.
- (void)getRenderBufferWithReply:(void (^)(XPC_PTR ptr, uint size))reply;

回复来自:

- (void)getRenderBufferWithReply:(void (^)(READER_PTR ptr, uint size))reply
{
    [self render];
    reply((XPC_PTR)[mRenderBuffer bytes], mRenderWidth * mRenderHeight * BYTES_PER_PIXEL, YES);
}

2 个答案:

答案 0 :(得分:0)

看来通过连接传递的所有对象必须符合NNSmage不符合的NSSecureCoding协议。

NSData确实符合这个协议,现在我通过连接传递它(不知道为什么当我之前尝试过NSData时它没有工作)。我正在使用发送的数据在主进程中创建NSImage。

发送指针的尝试事后看来是一个愚蠢的尝试,因为服务和主应用程序自然地运行不同的进程,因此它们被映射到不同的物理内存空间。

答案 1 :(得分:0)

NSImage符合NSSecureCoding协议

@interface NSImage:NSObject

所以不确定你的意思是什么?