我用下面的代码对此进行了测试。SomeClass 的定义使得 propertyA 是 hash 和 isEquals 中唯一考虑的属性:
SomeClass *objectA = [[[SomeClass alloc] init] autorelease];
objectA.propertyA = @"test";
objectA.propertyB = @"objectA";
SomeClass *objectB = [[[SomeClass alloc] init] autorelease];
objectB.propertyA = @"test";
objectB.propertyB = @"objectB";
NSSet *setA = [NSSet setWithObject:objectA];
NSSet *setB = [NSSet setWithObject:objectB];
NSSet *setC = [setA setByAddingObjectsFromSet:setB];
NSLog(@"Set A\n%@", [setA description]);
NSLog(@"Set B\n%@", [setB description]);
NSLog(@"Set C\n%@", [setC description]);
运行此代码时的输出是:
2011-03-03 16:35:15.041 temp[50311:207] Set A
{(
{SomeClass propertyA:test propertyB:objectA}
)}
2011-03-03 16:35:15.041 temp[50311:207] Set B
{(
{SomeClass propertyA:test propertyB:objectB}
)}
2011-03-03 16:35:15.042 temp[50311:207] Set C
{(
{SomeClass propertyA:test propertyB:objectA}
)}
这表明在参数包含等效对象的情况下,新创建的 NSSet 将包含来自 RECEIVER 的对象。
编辑- 我将此标记为答案,因为它直接回答了手头的问题。但是,我会在下面指出彼得的回答以及他所表达的担忧。这种行为是无证的,因此,虽然这些核心类在这方面发生变化的可能性极小,但值得指出这种风险。如果您编写代码假设这种行为,它可能会在未来的版本中中断。买者自负。