#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, copy) NSString *str1;
//copy 后的返回值是 “不可变” 字符串,所以 _str2,不能用copy修饰。
@property (nonatomic, copy) NSMutableString *str2;
//============================================
@property (nonatomic, copy) NSArray *arr1;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [self copyArray];
// NSLog(@"=================");
[self copyMutiArray2];
}
/*
对一个 ”不可变“ 字符串进行拷贝,是浅拷贝,四个字符串地址一样。
所以当把一个不可变字符串,赋值给另一个不可变字符串时,copy是没有意义的。
*/
- (void)copyString {
NSString *str = @"aaaaaaaaaaaaaaa";
self.str1 = str;
NSString *str2 = str.copy;
NSMutableString *str3 = str.copy;
// [str4 appendString:@"111"]; //copy 后的返回值是不可变的,所以会崩。
NSLog(@"\n str : %p,\n str1: %p,\n str2: %p,\n str3: %p",str,_str1,str2,str3);
}
/*
对一个 ”可变“ 字符串进行拷贝,是深拷贝,四个字符串地址不一样。
所以,NSString用copy修饰的原因是:当把一个可变的字符串赋值给不可变的字符串时,使用copy是深拷贝了一个字符串,这样可变字符串改变时,不会影响这个不可变字符串。
*/
- (void)copyMutiString {
NSMutableString *str = [NSMutableString stringWithString:@"bbbbbbbbbbbb"];
self.str1 = str;
NSString *str2 = str.copy;
NSMutableString *str3 = str.copy;
//地址不一样
NSLog(@"\n str : %p,\n str1: %p,\n str2: %p,\n str3: %p",str,_str1,str2,str3);
self.str2 = str;
[self.str2 appendString:@"2222"]; //copy 后的返回值是不可变的,所以会崩
}
- (void)copyArray {
NSArray *arr = @[@"11",@"22",@"33",@"44"];
self.arr1 = arr;
NSArray *arr2 = arr.copy;
NSMutableArray *arr3 = arr.copy;
//地址都一样
NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);
//地址都一样
NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);
}
/*
对一个 ”可变“ 数组进行拷贝,是深拷贝,四个数组地址不一样,但是数组中每一个元素的地址没有变化。
*/
- (void)copyMutiArray {
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"11",@"22",@"33",@"44"]];
self.arr1 = arr;
NSArray *arr2 = arr.copy;
NSMutableArray *arr3 = arr.copy;
//地址不一样
NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);
//地址都一样
NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);
}
- (void)copyMutiArray2 {
NSMutableString *s1 = [NSMutableString stringWithString:@"11"];
NSMutableString *s2 = [NSMutableString stringWithString:@"22"];
NSMutableString *s3 = [NSMutableString stringWithString:@"33"];
NSMutableString *s4 = [NSMutableString stringWithString:@"44"];
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[s1,s2,s3,s4]];
self.arr1 = arr;
NSArray *arr2 = arr.copy;
NSMutableArray *arr3 = arr.copy;
//地址不一样
NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);
//地址都一样
NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);
[arr[0] appendString:@"aa"];
//地址都一样,所以值都变了
NSLog(@"%@ %@, %@, %@",arr[0],_arr1[0],arr2[0],arr3[0]);
}