美文网首页
集合和非集合的copy与mutableCopy

集合和非集合的copy与mutableCopy

作者: Zorin | 来源:发表于2020-07-09 20:27 被阅读0次
    • 名词解释:

      非集合类:
      浅copy(指针地址copy):指针地址不同,内存地址相同;
      深copy(内存地址copy):指针地址不同,内存地址也不同;
      集合类:
      单层浅copy :集合对象浅copy ,集合内元素无copy;
      单层深copy :集合对象深copy ,集合内元素浅copy;

    • 简单结论

    对‘非集合不可变’对象copy为浅copy(指针复制),其他为深copy;
    对‘集合不可变对象’copy 为单层浅copy,其他均为单层深copy;


    以下为详细解释,以及试验步骤:

    1. 对非集合类对象的copy与mutableCopy

        NSString * string = @"string";    
        NSString * string1 = [string copy]; //
        NSString * string2 = [string mutableCopy];
    
        NSMutableString * mstring = [NSMutableString stringWithString:@"mutable"];
        NSString * string3 = [mstring copy];
        NSString * string4 = [mstring mutableCopy];
        
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",string.class,string,&string);
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",string1.class,string1,&string1);
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",string2.class,string2,&string2);
    
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",mstring.class,mstring,&mstring);
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",string3.class,string3,&string3);
        NSLog(@"类名%@;内存地址:%p;指针地址%p\n",string4.class,string4,&string4);
    
    2020-07-09 20:47:36.351957+0800 PHTemplate[58589:2189532] string: 类名__NSCFConstantString;内存地址:0x10db41088;指针地址:0x7ffee20bf5d8
    
    2020-07-09 20:47:36.352120+0800 PHTemplate[58589:2189532] string1: 类名__NSCFConstantString;内存地址:0x10db41088;指针地址:0x7ffee20bf5d0
    
    2020-07-09 20:47:36.352245+0800 PHTemplate[58589:2189532] string2: 类名__NSCFString;内存地址:0x600003fac8d0;指针地址:0x7ffee20bf5c8
    
    2020-07-09 20:47:36.352341+0800 PHTemplate[58589:2189532] mstring: 类名__NSCFString;内存地址:0x600003fac630;指针地址:0x7ffee20bf5c0
    
    2020-07-09 20:47:36.352470+0800 PHTemplate[58589:2189532] string3: 类名NSTaggedPointerString;内存地址:0xa5548df62c4383c0;指针地址:0x7ffee20bf5b8
    
    2020-07-09 20:47:36.352565+0800 PHTemplate[58589:2189532] string4: 类名__NSCFString;内存地址:0x600003fac660;指针地址:0x7ffee20bf5b0
    
    1. 由代码看出:

      只有string和string1的内存地址相同,指针地址不同;
      其他皆为,内存地址和指针地址都不同;

    2. 结合浅copy和深copy 的特性,由此可得结论:

      [immutableObject copy] // 浅复制。不可变
      [immutableObject mutableCopy] //深复制。可变
      [mutableObject copy] //深复制 不可变
      [mutableObject mutableCopy] //深复制 可变

    2. 对集合类对象的copy与mutableCopy

        NSMutableString * string =  [NSMutableString stringWithString:@"hello"];
        NSArray * arr = @[string];
        NSArray * arr1 = [arr copy]; //
        NSArray * arr2 = [arr mutableCopy];
        
        NSMutableArray * mArr = [NSMutableArray arrayWithArray:@[string]];
        NSArray * arr3 = [mArr copy];
        NSArray * arr4 = [mArr mutableCopy];
        
        NSLog(@"arr:  类名%@;内存地址:%p;指针地址:%p---内存:%p;",arr.class,arr,&arr,arr.firstObject);
        NSLog(@"arr1: 类名%@;内存地址:%p;指针地址:%p---内存:%p;",arr1.class,arr1,&arr1,arr1.firstObject);
        NSLog(@"arr2: 类名%@;内存地址:%p;指针地址:%p---内存:%p;",arr2.class,arr2,&arr2,arr2.firstObject);
        
        NSLog(@"mArr: 类名%@;内存地址:%p;指针地址:%p---内存:%p;",mArr.class,mArr,&mArr,mArr.firstObject);
        NSLog(@"arr3: 类名%@;内存地址:%p;指针地址:%p---内存:%p;",arr3.class,arr3,&arr3,arr3.firstObject);
        NSLog(@"arr4: 类名%@;内存地址:%p;指针地址:%p---内存:%p;",arr4.class,arr4,&arr4,arr4.firstObject);
    
    2020-07-09 21:12:03.297773+0800 PHTemplate[59848:2211493] arr: 类名__NSSingleObjectArrayI;内存:0x600001ce0200;指针:0x7ffee746f5b8---内存:0x6000010a5d40;
    2020-07-09 21:12:03.297910+0800 PHTemplate[59848:2211493] arr1: 类名__NSSingleObjectArrayI;内存地址:0x600001ce0200;指针地址:0x7ffee746f5b0---内存:0x6000010a5d40;
    2020-07-09 21:12:03.298026+0800 PHTemplate[59848:2211493] arr2: 类名__NSArrayM;内存地址:0x6000010a5f80;指针地址:0x7ffee746f5a8---内存:0x6000010a5d40;
    2020-07-09 21:12:03.298134+0800 PHTemplate[59848:2211493] mArr: 类名__NSArrayM;内存地址:0x6000010a55f0;指针地址:0x7ffee746f5a0---内存:0x6000010a5d40;
    2020-07-09 21:12:03.298244+0800 PHTemplate[59848:2211493] arr3: 类名__NSSingleObjectArrayI;内存地址:0x600001ce01f0;指针地址:0x7ffee746f598---内存:0x6000010a5d40;
    2020-07-09 21:12:03.298333+0800 PHTemplate[59848:2211493] arr4: 类名__NSArrayM;内存地址:0x6000010a6010;指针地址:0x7ffee746f590---内存:0x6000010a5d40;
    
    1. 观察集合对象的指针和内存地址的变化
      结果:

      和非集合的类似

      • 只有arr和arr1的内存地址相同,指针地址不同;
      • 其他皆为,内存地址和指针地址都不同;
    2. 观察集合内的元素的指针和内存地址的变化
      结果:

      • 内存地址皆相同:可知没有对元素深copy
    3. 结论

      [immutableObject copy] //集合类:浅复制、 不可变 ; 元素:未copy
      [immutableObject mutableCopy] //集合类:深复制、 可变; 元素:未copy
      [mutableObject copy] //集合类:深复制、 不可变; 元素:未copy
      [mutableObject mutableCopy] //集合类:深复制、 可变; 元素:为copy

    相关文章

      网友评论

          本文标题:集合和非集合的copy与mutableCopy

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