2

NSMutableSet を使用して一連のオブジェクトを作成しようとしています。オブジェクトは Song で、各タグには名前と作者があります。

コード:

#import "Song.h"

@implementation Song

@synthesize name,author;

-(Song *)initWithName:(NSString *)n andAuth:(NSString *)a {
    self = [super init];

    if (self) {
        name = n;
        author = a;
    }

    return self;
}

-(void)print {
    NSLog(@"song:%@; author:%@;", name,author);
}

-(BOOL)isEqual:(id)obj {
    //NSLog(@"..isEqual");

    if([[obj name] isEqualToString:name]
       && [[obj author] isEqualToString:author]) {
        return YES;
    }

    return NO;
}

-(BOOL)isEqualTo:(id)obj {
    NSLog(@"..isEqualTo");

    if([[obj name] isEqualToString:name]
       && [[obj author] isEqualToString:author]) {
        return YES;
    }

    return NO;
}

@end

次に、このオブジェクトを NSMutableSet に入れます:</p>

int main(int argv, char *argc[]) {
    @autoreleasepool {
        Song *song1 = [[Song alloc] initWithName:@"music1" andAuth:@"a1"];
        Song *song2 = [[Song alloc] initWithName:@"music2" andAuth:@"a2"];
        Song *song3 = [[Song alloc] initWithName:@"music3" andAuth:@"a3"];

        Song *needToRemove = [[Song alloc] initWithName:@"music3" andAuth:@"a3"];

        NSMutableSet *ns = [NSMutableSet setWithObjects:song1, song2, song3, nil];

        [ns removeObject:needToRemove];

        for (Song *so in ns) {
            [so print];
        }
    }
}

しかし、奇妙なことが起こりました。music3 はまだ NSMutableSet にあります。しかし、NSMutableArray に変更すると、music3 は削除できます。NSMutableArray の removeObject は、オブジェクトの isEqual メソッドを呼び出します。removeObject の説明を見つけました。一文:</p>

Removes a given object from the set.

それがどのように機能するかを説明していません.このようにオブジェクトを削除するには?NSMutableSetのremoveObjectはどのメソッドを呼び出しますか?

4

1 に答える 1

8

- (NSUInteger)hashObjective-cコレクションクラスは、等しいオブジェクトを把握することに依存しています。

オブジェクトがYESを返すisEqual:が、異なる場合hash、NSSetなどのクラスはオブジェクトを異なるものと見なします。

ハッシュの説明を参照してください:

2つのオブジェクトが等しい場合(isEqual:メソッドによって決定される場合)、それらは同じハッシュ値を持っている必要があります。この最後の点は、サブクラスでハッシュを定義し、そのサブクラスのインスタンスをコレクションに入れる場合に特に重要です。

ハッシュメソッドを実装します。このようなものが機能するはずです:

- (NSUInteger)hash {
    return [self.author hash] ^ [self.name hash];
}
于 2013-01-12T12:08:56.203 に答える