经测试得出如下结论:【测试代码和测试结果见后面】
不管是非集合类对象,还是集合类对象,执行copy之后的对象,不管是浅复制还是深复制,都是不可变的对象,没有可变对象的增删方法,所以执行增、删方法会崩溃。
1、非集合类对象
不可变对象:copy:浅复制
不可变对象:mutableCopy:深复制,新对象可变
可变对象:copy:深复制,新对象不可变
可变对象:mutableCopy:深复制,新对象可变
非集合类对象测试代码如下:
NSString *str1 = @"11111";
NSString *str11 = [str1 copy];
NSMutableString *str12 = [str1 mutableCopy];
NSLog(@"原始不可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str1,&str1,str1,[str1 class]);
NSLog(@"不可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str11,&str11,str11,[str11 class]);
NSLog(@"不可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str12,&str12,str12,[str12 class]);
NSLog(@"--------------------------------------");
NSMutableString *str2 = [NSMutableString stringWithString:@"22222"];
NSMutableString *str21 = [str2 copy];
NSMutableString *str22 = [str2 mutableCopy];
NSLog(@"原始可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str2,&str2,str2,[str2 class]);
NSLog(@"可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str21,&str21,str21,[str21 class]);
NSLog(@"可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str22,&str22,str22,[str22 class]);
NSLog(@"-------------------修改原始字符串之后-------------------");
str1 = @"wwww";
NSLog(@"原始不可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str1,&str1,str1,[str1 class]);
NSLog(@"不可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str11,&str11,str11,[str11 class]);
NSLog(@"不可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str12,&str12,str12,[str12 class]);
NSLog(@"--------------------------------------");
[str2 appendString:@"hhh"];
NSLog(@"原始可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str2,&str2,str2,[str2 class]);
NSLog(@"可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str21,&str21,str21,[str21 class]);
NSLog(@"可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str22,&str22,str22,[str22 class]);
NSLog(@"--------------------------------------");
[str12 appendString:@"kkk"];
// [str21 appendString:@"mmm"];//执行这句话会崩溃,因为是不可变对象
[str22 appendString:@"nnn"];
非集合类对象测试结果如下:
2、集合类对象
不可变对象:copy:浅复制
不可变对象:mutableCopy:单层深复制,新对象可变
可变对象:copy:单层深复制,新对象不可变
可变对象:mutableCopy:单层深复制,新对象可变
单层深复制:新对象包含的元素还是旧的
集合类对象测试代码如下:
NSArray *a1 = @[@"1",@"2"];
NSArray *a2 = @[@"3",@"4"];
NSArray *a3 = @[@"5",@"6"];
NSArray *array = @[a1,a2,a3];
// 不可变对象copy和mutableCopy
NSArray *arrayCopy1 = [array copy];
NSMutableArray *arrayCopy2 = [array mutableCopy];
// 可变对象copy和mutableCopy
NSMutableArray *arrayMutCopy1 = [arrayCopy2 copy];
NSMutableArray *arrayMutCopy2 = [arrayCopy2 mutableCopy];
NSLog(@"原始不可变数组-------------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&array,array,[array class],array[0]);
NSLog(@"不可变数组-->copy---------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayCopy1,arrayCopy1,[arrayCopy1 class],arrayCopy1[0]);
NSLog(@"不可变数组-->mutableCopy--指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayCopy2,arrayCopy2,[arrayCopy2 class],arrayCopy2[0]);
NSLog(@"可变数组-->copy-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayMutCopy1,arrayMutCopy1,[arrayMutCopy1 class],arrayMutCopy1[0]);
NSLog(@"可变数组-->mutableCopy----指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayMutCopy2,arrayMutCopy2,[arrayMutCopy2 class],arrayMutCopy2[0]);
NSLog(@"--------------------------------------");
[arrayCopy2 addObject:@"8"];
// [arrayMutCopy1 addObject:@"9"];//执行这段代码会崩溃,因为copy之后的对象是不可变
[arrayMutCopy2 addObject:@"10"];
集合类对象测试结果如下: