遇到一个有趣的小问题。我正在编写一种将数组过滤为唯一对象的方法:
- (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% 的时间测试通过,但由于该distinctObjectsByAddress
方法只返回一个对象,所以它经常失败。我已经能够将其追溯到[NSSet setWithArray:self]
调用,但我也能够验证这两个人对象是两个不同的对象(至少它们具有不同的地址)。我假设这setWithArray:
只是做一个基本的地址比较,但我不明白为什么它有时会产生两个像它应该的对象,有时只产生一个。
我刚刚尝试过的东西正在改变adam2
,所以名字和姓氏不完全相同adam1
。这似乎修复了错误。当对象在逻辑上相同时,这是否指向某种编译器优化?