興味深い小さな問題に遭遇しました。配列を一意のオブジェクトにフィルター処理するメソッドを作成していました。
- (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);
}
ものすごく単純。distinctObjectsByAddress
興味深いのは、メソッドがオブジェクトを 1 つしか返さないため、約 80 ~ 90% の確率でテストが成功し、場合によっては失敗することです。通話までたどることができました[NSSet setWithArray:self]
が、2 人の人物オブジェクトが 2 つの異なるオブジェクトであることも確認できました (少なくとも、アドレスは異なります)。基本的なアドレス比較を行ってsetWithArray:
いるだけだと思いますが、2つのオブジェクトを生成する場合と1つだけを生成する場合がある理由がわかりません。
私が試したのはadam2
、名前と姓が とまったく同じにならないように変更していたことadam1
です。これはエラーを修正するようです。オブジェクトが論理的に同じである場合、これはある種のコンパイラの最適化を示していますか?