Преобразование NSArray в NSSet, передача экземпляров пользовательских классов непоследовательно

Решил небольшую интересную задачу. Я писал метод фильтрации массива по уникальным объектам:

- (NSArray*)distinctObjectsByAddress {
    NSSet* uniqueSet = [NSSet setWithArray:self];
    NSArray* retArray = [uniqueSet allObjects];

    return retArray;
}

и написал модульный тест для проверки:

- (void)testDistinctObjectsByAddress5 {
    Person* adam1 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];
    Person* adam2 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];

    testPersonArray = [NSArray arrayWithObjects:adam1,adam2, nil];

    NSArray* checkArray = [testPersonArray distinctObjectsByAddress];

    STAssertEquals([checkArray count], [testPersonArray count], @"Array %@ counts should match %@ %@",checkArray,adam1,adam2);
}

Довольно просто. Интересно то, что примерно в 80-90% случаев тест проходит, и время от времени он терпит неудачу, потому что метод independentObjectsByAddress возвращает только один объект. Мне удалось отследить это до вызова [NSSet setWithArray: self] , но я также смог проверить, что два объекта-лица - это два разных объекта (по крайней мере, у них разные адреса). Я предполагаю, что setWithArray: просто выполняет базовое сравнение адресов, но я не понимаю, почему он иногда создает два объекта, как должен, а иногда только один.

Я только что попробовал изменить adam2 так, чтобы имя и фамилия не совпадали с adam1 . Кажется, это исправляет ошибку. Указывает ли это на некоторую оптимизацию компилятора, когда объекты логически одинаковы?

7
задан Josh Caswell 20 February 2012 в 02:26
поделиться