2011-12-24 2 views
1

У меня есть подкласс NSObject, в котором я Реализована isEqual: и hash методы следующим образом: Для целей тестирования:NSMutableSet позволяет добавлять несколько объектов с той же хэш

- (BOOL)isEqual:(id)anObject { 
    return YES; 
} 

- (NSUInteger)hash { 
    return 1; 
} 

По некоторым причинам, я могу добавить несколько объектов этого класса в NSMutableSet, даже если они являются «одинаковыми». Есть ли причина, по которой это не будет работать?


Update: Оказывается, я был назначая экземпляр NSMutableArray к Ивар типа NSMutableSet. D'о!

+2

Добавление одного и того же объекта не приводит к ошибке, оно просто не изменит набор. – vikingosegundo

ответ

1

Там должно быть что-то еще в вашем коде, что вы не делаете правильно, потому что переопределение методов, как вы показываете в ОП приводит к NSMutableSet признать свои объекты как идентичные:

test.h:

#import "Foundation/Foundation.h" 
@interface Test : NSObject 
@end 

Test.m:

#import "Test.h" 
@implementation Test 
- (BOOL)isEqual:(id)anObject { 
    return YES; 
} 
- (NSUInteger)hash { 
    return 1; 
} 
@end 

main.c:

#include <CoreFoundation/CoreFoundation.h> 
#import "Test.h" 
int main (int argc, const char * argv[]) { 
    Test *t1 = [[Test alloc] init]; 
    Test *t2 = [[Test alloc] init]; 
    Test *t3 = [[Test alloc] init]; 
    Test *t4 = [[Test alloc] init]; 
    NSSet *s = [NSMutableSet setWithObjects:t1, t2, t3, t4, nil]; 
    NSLog(@"%lu", s.count); 
    return 0; 
} 

Этот снимок производит 1, как и ожидалось.

1

Метод addObject возвращает void и не дает никакой обратной связи относительно того, действительно ли элемент был добавлен.

- (void)addObject:(id)object

Вы перечисляя набор для определения того, что объект (ы) были «добавлены дважды»? В противном случае, что заставляет вас поверить в это?

Если два набора были объединены вместе с unionSet, возникла ли ошибка, если оба набора содержат один и тот же объект? Или должен ли результат просто включать тот же объект, что и исходные наборы?

Что делать, если вы хотите объединить набор точно одного элемента? Потому что, если вы согласны с вышесказанным, тогда вы поймете, почему я говорю следующее ...

Я думаю, что это просто беззвучно проглотит вторую попытку (как она и предполагалось) и продолжила жизнь.

+0

Спасибо. Оба хороших ответа, но я должен был выбрать только один. – titaniumdecoy

Смежные вопросы