NSSet:obj-c的唯一集合

Objective-C有3种集合类型(collection):array,dictionary,set,他们三者的定义如下:

array:有序集合

dictionary:键-值集合

set:无序唯一集合

前2者大家用得比较多,只有set,很可能大家都没用过

先看看以下代码:

NSMutableSet* setA = [NSMutableSet new];

NSArray* arrayA = @[@1, @2];

[setA addObject:arrayA];

NSArray* arrayB =@[@1];

[setA addObject:arrayB];

NSLog(@"setA : %@", setA);

看看控制台输入,A和B都有

更改一下程序,将arrayB初始化与arrayA一样

NSArray* arrayB =@[@1,@2];

控制台的输出只有一个对象,符合我们的预期

再更改一下程序,将array更改为可修改的,如下:

NSMutableSet* setA = [NSMutableSet new];

NSMutableArray* arrayA = [@[@1,@2] mutableCopy];

[setA addObject:arrayA];

NSMutableArray* arrayB = [@[@1] mutableCopy];

[setA addObject:arrayB];

NSLog(@"setA : %@", setA);

输出还是有2个array,还是符合我们的预期

更改一下arrayB的值,使得arrayB与arrayA的内容相同,会有什么效果呢?

[arrayB addObject:@2];

NSLog(@"setA after change: %@", setA);

输出了2个一样的array,说好的唯一性呢???

如果这时将setA复制赋值给一个新的set,会怎样呢:

NSSet* setB = [setA copy];

NSLog(@"setB : %@", setB);

setB又只有一个array,这世界乱套了

经过这么折腾后,代码如下:

NSMutableSet* setA = [NSMutableSet new];

NSMutableArray* arrayA = [@[@1,@2] mutableCopy];

[setA addObject:arrayA];

NSMutableArray* arrayB = [@[@1] mutableCopy];

[setA addObject:arrayB];

NSLog(@"setA : %@", setA);

[arrayB addObject:@2];

NSLog(@"setA after change: %@", setA);

NSSet* setB = [setA copy];

NSLog(@"setB : %@", setB);

总结如下:

1.尽量不要将可变对象放到set里面去,因为后续如果更改可变对象,可能会打破set的唯一性

2.set copy的时候会检测对象的唯一性

你可能感兴趣的:(NSSet:obj-c的唯一集合)