首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSConnection --如何正确地对一个对象进行“去处”?

NSConnection --如何正确地对一个对象进行“去处”?
EN

Stack Overflow用户
提问于 2015-07-05 02:05:12
回答 1查看 702关注 0票数 2

对于Mac,我尝试使用NSConnection代理从一个应用程序实例访问同一个主机上的另一个应用程序实例。相关代码如下。如果需要的话我可以提供更多。假设当我说"server“时,我指的是实际使用NSConnection”销售“对象的应用程序。"client“是同一个应用程序的另一个实例,它获得了一个代理。

一切正常,除了两个问题。

  1. 当作为服务器的应用程序试图删除它正在销售的对象时,通过代理连接的任何客户端仍然保留。也就是说,即使我在下面调用了我的stopLocalServer函数,以前连接并得到代理对象的任何客户端应用程序仍然能够在服务器应用程序上发送消息和调用代码。在服务器调用NSConnection:invalidate之后传递消息时,我希望客户端会抛出异常。如何在不要求服务器进程退出的情况下强行断开任何客户端?
  2. 在下面的startClientConnection代码中,如果服务器从一开始就没有使用预期的注册名称来支持对象,那么对客户端对NSConnection:connectionWithRegisteredName:host的调用将立即返回零。这很好。但是,如果服务器已经开始通过下面的startLocalServer代码自动出售一个对象,那么以后不再用stopLocalServer来销售它,随后的客户端连接尝试将挂起(永远阻塞),直到服务器应用程序进程退出为止。对NSConnection的调用:connectionWithRegisteredName返回一个非零对象,但是对[_clientConnection rootProxy]的调用将永远挂起,直到服务器应用程序实际退出。

我怀疑我没有正确地撕毁原始的NSConnection对象,或者我在这里缺少一些基本的东西。

下面是我的用户界面代码所在的平台的一些相关代码:

代码语言:javascript
复制
-(void)startLocalServer:(NSString*)str
{
    [self stopLocalServer];  // clean up any previous instance that might be running
    _serverConnection = [NSConnection new];
    [_serverConnection setRootObject:self];
    [_serverConnection registerName:str];
}
-(void)stopLocalServer
{
    [_serverConnection registerName:nil];
    [_serverConnection setRootObject:nil];
    [_serverConnection invalidate];
    _serverConnection = nil;
}

-(void)startClientConnection:(NSString*)str
{
    [self stopClientConnection];  // tear down any previous connection

    _clientConnection = [NSConnection connectionWithRegisteredName:str host:nil];

    if ((_clientConnection == nil) || (_clientConnection.valid == NO))
    {
        LogEvent(@"ERROR - _clientConnection is nil or invalid!");
    }
    else
    {
        _proxy = [_clientConnection rootProxy];
    }
}

-(void)stopClientConnection
{
    _proxy = nil;
    [_clientConnection invalidate];
    _clientConnection = nil;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 09:32:17

回答我自己的问题。我仍然会坚持一个更好的答案,或者,如果有人能更好地解释为什么需要这样做的理由。

我认为stopLocalServer函数需要调用[[_serverConnection receivePort] invalidate],以便关闭使用连接创建的端口。只要将这一行添加到原始的stopLocalServer函数中,就可以解决我的问题。这将阻止进一步的连接尝试和消息的成功。

更恰当的是,应用程序调用可以只拥有NSConnection使用的端口。因此,这将成为启动和停止分布式对象侦听器的更好解决方案:

代码语言:javascript
复制
-(void)startLocalServer:(NSString*)str
{
    [self stopLocalServer];  // clean up any previous instance that might be running
    _port = [NSPort port];   // _port is of type NSPort*
    _serverConnection = [NSConnection connectionWithReceivePort:_port sendPort:nil];
    [_serverConnection setRootObject:self];
    [_serverConnection registerName:str];
}


-(void)stopLocalServer
{
    [_serverConnection registerName:nil];
    [_serverConnection setRootObject:nil];
    [_serverConnection invalidate];
    _serverConnection = nil;

    [_port invalidate];
    _port = nil;
}

这似乎解决了上面的#1和#2。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31226608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档