3

我希望做这样的事情:

netServiceBrowser:didFindService:moreComing:

[self.foundServices addObject:aNetService];

而在netServiceBrowser:didRemoveService:moreComing:

[self.foundServices removeObject:aNetService];

但是,返回的服务不会被 NetServiceBrowser 保留,因此给出的服务didRemoveService与数组中的服务不是同一个对象。如何比较服务以确保我删除的服务是正确的?

4

2 回答 2

5

你想太多了,在你的脑海里制造了一个不存在的问题。removeObject:在传入的对象上使用didRemoveService:. removeObject:删除基于对象对 的响应isEqual:,而不是对象的地址或身份。所以这将起作用。

答案真的很简单:

[self.foundServices removeObject:aNetService];

苹果的描述removeObject:解释了这一点:

此方法用于indexOfObject:定位匹配项,然后使用 删除它们removeObjectAtIndex:。因此,匹配是根据对象对isEqual:消息的响应来确定的。

(为了完整起见,Apple确实提供了一个按地址删除对象的功能。那就是removeObjectIdenticalTo:。但是,这不是您想要的行为。只需使用removeObject:。)

参考:

于 2012-05-29T05:30:03.523 回答
0

简短的回答,我最终不得不使用它,但我不能再重现这个问题了。使用选定的答案。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [self.foundServices addObject:aNetService];
}


- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    NSNetService *found = nil;

    for(NSNetService *ns in self.foundServices) {
        if([ns isEqualTo:aNetService]) {
            found = ns;
        }
    }

    if(found) {
        [self.foundServices removeObject:found];
    }
}
于 2012-05-29T05:24:37.770 回答