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的时候会检测对象的唯一性