【问题标题】:Objective-C: Avoiding EXCEPTIONS when NSConnection to Distributed Objects failObjective-C:当 NSConnection 到分布式对象失败时避免异常
【发布时间】:2012-05-24 14:59:44
【问题描述】:

我正在使用 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 挂起,谁拥有出售的对象?

【问题讨论】:

  • 我还没有解决这个问题,但是我现在看到了这个整体设计的一个缺陷。因为 DO 在从远处对象检索返回值时会阻塞,所以现在我可以像我计划的那样在动画 Quartz 补丁中使用它。如果我这样做了,它会使视频非常紧张。我根本不能让这种事情发生。我需要制作根对象的递归本地副本,并对其进行处理,而不是远程对象。

标签: objective-c exception distributed-objects nsconnection


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多