3

私はこのようなことをしたいと思っていました:

netServiceBrowser:didFindService:moreComing:

[self.foundServices addObject:aNetService];

そしてでnetServiceBrowser:didRemoveService:moreComing:

[self.foundServices removeObject:aNetService];

ただし、返されたサービスはNetServiceBrowserによって保持されないため、で指定されたサービスdidRemoveServiceは配列内のサービスと同じオブジェクトではありません。サービスを比較して、削除したサービスが正しいことを確認するにはどうすればよいですか?

4

2 に答える 2

5

あなたはこれを考えすぎて、存在しない問題を頭の中に作り出しています。removeObject:に渡されたオブジェクトで使用しますdidRemoveService:。オブジェクトのアドレスやIDではなく、removeObject:に対するオブジェクトの応答に基づいて削除します。isEqual:したがって、これはうまくいきます。

答えは本当に簡単です:

[self.foundServices removeObject:aNetService];

Appleの説明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 に答える