【发布时间】: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