iOS copy和mutableCopy

经测试得出如下结论:【测试代码和测试结果见后面】

不管是非集合类对象,还是集合类对象,执行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"];

非集合类对象测试结果如下:


iOS copy和mutableCopy_第1张图片
image.png

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"];

集合类对象测试结果如下:


image.png

你可能感兴趣的:(iOS copy和mutableCopy)