0

我正在使用 Objective-C 分布式对象 (DO) 将数据从一个应用程序(从网络收集数据)共享到另一个应用程序(Quartz Composer 中的一个补丁)。当与远程对象的连接失败时(当我关闭第一个应用程序时),我得到:

5/16/12 8:17:06.373 PM Quartz Composer: *** EXCEPTION IGNORED: connection went invalid while waiting for a reply because a mach port died

在那之后,Quartz 组合被挂起。即使在我恢复第一个应用程序之后,它仍然挂起。我希望 Quartz 补丁重新连接。

我正在使用通知中心关闭旧对象,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(connectionDidDie)
                                             name:NSConnectionDidDieNotification
                                           object:theConnection];

现在,我的 counnectionDidDie 看起来像这样:

- (void) connectionDidDie
{
    NSLog(@"Connection died and we detected it");
    [[self proxyObject] release];
    [self setProxyObject:nil];
    theConnection = nil;
}

我还检查以确保连接仍然存在,就在访问 proxyObject 的任何部分之前,如下所示:

if ([NSConnection defaultConnection]) { // this line triggers the exception
    // access proxyObject
}

我也试过

if ([theConnection isValid]) { // this line triggers the exception
    // access proxyObject
}

在这两种情况下,正是这个测试触发了这个异常。

当我关闭第一个应用程序时,我能做些什么来防止 Quartz 挂起,谁拥有出售的对象?

4

1 回答 1

0

我从来没有找到一种方法来足够快地关闭 DO 连接,以防止 QC 以每秒 30-60 帧的速度绘制,在调用 connectionDidDie: 之前先测试连接(并崩溃)。最终,我决定使用 DO,只是为了获取对象的初始副本,然后对其进行深层复制,然后在没有任何尝试访问它的情况下终止 DO 连接。在您深入研究之后,DO 似乎并不是那么好的解决方案。:(

于 2012-05-19T16:08:08.057 回答