上一篇是关于OC中字符串的copy、mutablecopy的讨论,本篇将对集合类型进行讨论,以NSArray为例
带着问题我们进行如下讨论: 测试代码
1、NSArray的copy
NSArray *arr = @[@"1",@"2",@"3"];
NSLog(@"%p",arr);
NSArray *arrCopy1 = [arr copy];
NSLog(@"%p",arrCopy1);
NSMutableArray *arrCopy2 = (NSMutableArray *)[arr copy];
NSLog(@"%p",arrCopy2);
NSArray *arrCopy3 = [arr copy];
NSLog(@"%p",arrCopy3);
NSMutableArray *arrCopy4 = [arr copy];
NSLog(@"%p",arrCopy4);
控制台输出如下
![](https://img.haomeiwen.com/i3748868/58ca605bf232b097.png)
NSArray的copy和NSString的copy一样
只是相当于“强引用” ,也就是浅拷贝。
![](https://img.haomeiwen.com/i3748868/73eada8948f96503.png)
2、NSArray的mutableCopy
NSArray *arr = @[@"1",@"2",@"3"];
NSLog(@"%p",arr);
NSArray *arrCopy1 = [arr mutableCopy];
NSLog(@"%p",arrCopy1);
NSMutableArray *arrCopy2 = [arr mutableCopy];
NSLog(@"%p",arrCopy2);
NSArray *arrCopy3 = [arr mutableCopy];
NSLog(@"%p",arrCopy3);
NSMutableArray *arrCopy4 = [arr mutableCopy];
NSLog(@"%p",arrCopy4);
控制台输出如下
![](https://img.haomeiwen.com/i3748868/9eacc691d9df153f.png)
他们都是可变数组
![](https://img.haomeiwen.com/i3748868/dcdfd5f3e90c378a.png)
3、NSMutableArray的copy
NSArray *arr = @[@"1",@"2",@"3"];
NSLog(@"%p",arr);
NSArray *mutArr = [arr mutableCopy];
NSLog(@"%p",mutArr);
NSArray *arrCopy1 = [mutArr copy];
NSLog(@"%p",arrCopy1);
NSMutableArray *arrCopy2 = (NSMutableArray *)[mutArr copy];
NSLog(@"%p",arrCopy2);
NSArray *arrCopy3 = [mutArr copy];
NSLog(@"%p",arrCopy3);
NSMutableArray *arrCopy4 = [mutArr copy];
NSLog(@"%p",arrCopy4);
控制台输出如下
![](https://img.haomeiwen.com/i3748868/6755d42e6c5f5e51.png)
内存地址信息如下
![](https://img.haomeiwen.com/i3748868/4bd1a13ee22c0725.png)
对NSMutableArray进行copy操作之后,得到的依然是不可变数组,</br>与NSMutableString的copy不同的是,每次copy都会得到一个不同的地址
4、NSMutableArray的mutableCopy
NSArray *arr = @[@"1",@"2",@"3"];
NSLog(@"%p",arr);
NSArray *mutArr = [arr mutableCopy];
NSLog(@"%p",mutArr);
NSArray *arrCopy1 = [mutArr mutableCopy];
NSLog(@"%p",arrCopy1);
NSMutableArray *arrCopy2 = [mutArr mutableCopy];
NSLog(@"%p",arrCopy2);
NSArray *arrCopy3 = [mutArr mutableCopy];
NSLog(@"%p",arrCopy3);
NSMutableArray *arrCopy4 = [mutArr mutableCopy];
NSLog(@"%p",arrCopy4);
控制台输出如下
![](https://img.haomeiwen.com/i3748868/98fc87bb964a8c1e.png)
内存地址信息如下
![](https://img.haomeiwen.com/i3748868/6db3809a4c4d6073.png)
对NSMutableArray进行mutableCopy操作之后,得到的依然是不可变数组,而且每次mutableCopy都会得到一个不同的地址
总结:
- copy产生不可变类型,mutableCopy产生可变类型;
- 只要mutablecopy就会开辟空间;
- copy不可变数组相当于强引用,不会开辟空间;
- copy可变数组会开辟空间;
从这里可以看出集合类型的copy与NSString非常类似,在使用NSArray引用NSMuableArray的时候也要使用copy
例如:
- (NSArray *)array {
NSMutableArray *mutArr = [NSMutableArray array];
[mutArr addObject:@"1"];
return [mutArr copy];
}
- (NSMutableArray *)mutableArray {
NSArray *arr = @[@"1",@"2",@"3"];
return [arr mutableCopy];
// return [NSMutableArray arrayWithArray:arr]; //Foundation提供的方法
}
网友评论