Решил небольшую интересную задачу. Я писал метод фильтрации массива по уникальным объектам:
- (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
. Кажется, это исправляет ошибку. Указывает ли это на некоторую оптимизацию компилятора, когда объекты логически одинаковы?