上一篇是關(guān)于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);
控制臺輸出如下
Snip20161225_23.png
NSArray的copy和NSString的copy一樣
只是相當于“強引用” 繁莹,也就是淺拷貝檩互。
copy后的數(shù)組類型
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);
控制臺輸出如下
每一個mutableCopy的數(shù)組咨演,地址都不同
他們都是可變數(shù)組
Snip20161225_26.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);
控制臺輸出如下
Snip20161225_28.png
內(nèi)存地址信息如下
Snip20161225_27.png
對NSMutableArray進行copy操作之后,得到的依然是不可變數(shù)組,</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);
控制臺輸出如下
Snip20161225_30.png
內(nèi)存地址信息如下
Snip20161225_29.png
對NSMutableArray進行mutableCopy操作之后,得到的依然是不可變數(shù)組循诉,而且每次mutableCopy都會得到一個不同的地址
總結(jié):
- copy產(chǎn)生不可變類型横辆,mutableCopy產(chǎn)生可變類型;
- 只要mutablecopy就會開辟空間;
- copy不可變數(shù)組相當于強引用茄猫,不會開辟空間狈蚤;
- copy可變數(shù)組會開辟空間;
從這里可以看出集合類型的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提供的方法
}