美文网首页
iOS-深拷贝和浅拷贝

iOS-深拷贝和浅拷贝

作者: lq_ios | 来源:发表于2020-10-22 13:29 被阅读0次

什么是深拷贝和浅拷贝

  • 深复制:直接拷贝生成一个新对象,改变原对象的属性不会影响新的对象,在内存中出现了两个独立的对象本身。

  • 浅拷贝:并不拷贝对象本身,只是对指向对象的指针进行拷贝,改变原对象的属性会影响新的对象,内存中本质上还是一个对象。

非容器类的深拷贝和浅拷贝

  1. 不可变对象的拷贝
    //[str1 mutableCopy];生成的是一个可变对象
    //因为都是不可变字符串,创建方式并不影响拷贝方式。
    NSString *str1 = @"这是string";
    NSString *str2 = [str1 copy];
    NSString *str3 = [str1 mutableCopy];
    NSMutableString *str4 = [str1 copy];
    NSMutableString *str5 = [str1 mutableCopy];
    
    NSLog(@"str1 = %p    str2 = %p",str1,str2);
    NSLog(@"str1 = %p    str3 = %p",str1,str3);
    NSLog(@"str1 = %p    str4 = %p",str1,str4);
    NSLog(@"str1 = %p    str5 = %p",str1,str5);
    /*
       str1 = 0x10a812070    str2 = 0x10a812070
       str1 = 0x10a812070    str3 = 0x60000139fbd0
       str1 = 0x10a812070    str4 = 0x10a812070
       str1 = 0x10a812070    str5 = 0x60000139e1c0
     */

对与非容器不可变对象,copy是浅拷贝,mutableCopy是深拷贝
不可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。

  1. 可变对象的拷贝
  NSMutableString *str1 = [[NSMutableString alloc]initWithString:@"这是一个string"];
    NSString *str2 = [str1 copy];
    NSString *str3 = [str1 mutableCopy];
    NSMutableString *str4 = [str1 copy];
    NSMutableString *str5 = [str1 mutableCopy];
    
    NSLog(@"str1 = %p    str2 = %p",str1,str2);
    NSLog(@"str1 = %p    str3 = %p",str1,str3);
    NSLog(@"str1 = %p    str4 = %p",str1,str4);
    NSLog(@"str1 = %p    str5 = %p",str1,str5);
    
    /*
        str1 = 0x600001085bf0    str2 = 0x600001086040
        str1 = 0x600001085bf0    str3 = 0x600001085a70
        str1 = 0x600001085bf0    str4 = 0x600001085d10
        str1 = 0x600001085bf0    str5 = 0x600001085c20
     */

对与非容器可变对象,copy,mutableCopy都是深拷贝
可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。

容器类的深拷贝和浅拷贝

  1. 不可变对象的拷贝
  NSArray *arr1 = @[@"1",@"2",@"3"];
    
    NSArray *arr2 = [arr1 copy];
    NSArray *arr3 = [arr1 mutableCopy];
    NSMutableArray *arr4= [arr1 copy];
    NSMutableArray *arr5 = [arr1 mutableCopy];
    
    NSLog(@"arr1 = %p   arr2 = %p",arr1,arr2);
    NSLog(@"arr1 = %p   arr3 = %p",arr1,arr3);
    NSLog(@"arr1 = %p   arr4 = %p",arr1,arr4);
    NSLog(@"arr1 = %p   arr5 = %p",arr1,arr5);
    
   /*
      arr1 = 0x600002e6ad60   arr2 = 0x600002e6ad60
      arr1 = 0x600002e6ad60   arr3 = 0x600002e6a040
      arr1 = 0x600002e6ad60   arr4 = 0x600002e6ad60
      arr1 = 0x600002e6ad60   arr5 = 0x600002e69ef0
    */
    

对与容器不可变对象,copy是浅拷贝,mutableCopy是深拷贝
不可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。

  1. 可变对象的拷贝
   NSMutableArray *arr1 = [[NSMutableArray alloc]initWithArray:@[@"1",@"2",@"3"]];
    
    NSArray *arr2 = [arr1 copy];
    NSArray *arr3 = [arr1 mutableCopy];
    NSMutableArray *arr4= [arr1 copy];
    NSMutableArray *arr5 = [arr1 mutableCopy];
    
    NSLog(@"arr1 = %p   arr2 = %p",arr1,arr2);
    NSLog(@"arr1 = %p   arr3 = %p",arr1,arr3);
    NSLog(@"arr1 = %p   arr4 = %p",arr1,arr4);
    NSLog(@"arr1 = %p   arr5 = %p",arr1,arr5);
    
   /*
      arr1 = 0x6000002df810   arr2 = 0x6000002df300
      arr1 = 0x6000002df810   arr3 = 0x6000002dd0e0
      arr1 = 0x6000002df810   arr4 = 0x6000002df690
      arr1 = 0x6000002df810   arr5 = 0x6000002dd5c0
    */

对与容器可变对象,copy,mutableCopy都是深拷贝
可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。

综上所述,对与不可变对象,copy是浅拷贝,mutableCopy是深拷贝。对与可变对象,copy,mutableCopy都是深拷贝。

怎么使用copy关键字?

  1. NSString,NSArray,NSDictionary等经常使用到copy,
    是因为他们对应的可变类型NSMutableString,NSMutableArray,NSMutableDictionary,它们之间可以进行赋值操作,为确保对象中的值不能随意变动,应该在设置新值时拷贝一份。
  2. block 也使用copy。

@property(nonatomic,copy)NSMutableArray *array;这么写会出现什么问题?

  • 在添加,删除,修改数组内元素时,程序会因为找到不到对应的方法而奔溃,应为copy就是复制一个不可变的NSArray对象

相关文章

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • iOS-浅拷贝和深拷贝

    深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我...

  • iOS-深拷贝和浅拷贝

    什么是深拷贝和浅拷贝 深复制:直接拷贝生成一个新对象,改变原对象的属性不会影响新的对象,在内存中出现了两个独立的对...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

网友评论

      本文标题:iOS-深拷贝和浅拷贝

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