美文网首页
iOS copy和mutableCopy

iOS copy和mutableCopy

作者: sy随缘 | 来源:发表于2019-03-14 21:59 被阅读0次

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

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

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


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

    iOS中copy有两种copy和mutableCopy

  • copy与mutablecopy使用对比

    杂七杂八 copy和mutableCopy都是浅拷贝!!!iOS中的copy,mutableCopy,深拷贝和浅拷...

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • 【iOS】copy和mutableCopy

    NSString NSString copy 没有生成新的字符串 NSString mutableCopy 生成了...

  • iOS copy和mutableCopy

    一、copy (1)用copy修饰的 或者赋值的 变量肯定是不可变的。 (2)用copy赋值,要看源对象是否是可变...

  • iOS copy和mutableCopy

    经测试得出如下结论:【测试代码和测试结果见后面】 不管是非集合类对象,还是集合类对象,执行copy之后的对象,不管...

  • iOS copy和mutableCopy

    心得:不管是copy还是mutableCopy,目的都是拷贝出来一个新的对象,并且值都不变。 由于值不变所以: 只...

  • iOS copy 和 mutableCopy

    copy 和mutableCopy 这种老生常谈的问题,还是得掰扯掰扯 之前在我们的意识当中 copy 和muta...

  • iOS开发深拷贝与浅拷贝的关系

    IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解 copy与retain的区别: copy是创建...

  • copy和mutableCopy

    copy和mutableCopy copy只会产生不可变的副本对象(比如NSString) mutableCopy...

网友评论

      本文标题:iOS copy和mutableCopy

      本文链接:https://www.haomeiwen.com/subject/ffuhmqtx.html