zoukankan      html  css  js  c++  java
  • Copy-->Mutable Copy

    一、深拷贝和浅拷贝

    • 深拷贝:对象拷贝 - 直接拷贝内容。
    • 浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。

    二、对于 Copy 与 mutableCopy 的实践
    • 思路:我用四个方案来验证 Copy 与 mutableCopy 的区别。
    • 方案:

      • 方案一:copy不可变的字符串

        NSString*str = @"aaa";
        NSString*copyStr = [str copy];
        NSLog(@"str = %p copyStr= %p",str,copyStr);
        NSLog(@"指针地址:str = %p copyStr= %p",&str,&copyStr);

        输出结果:str = 0x104d94068 copyStr= 0x104d94068
        指针地址:str = 0x7fff529e9aa8 copyStr= 0x7fff529e9aa0
        小结:对不可变的字符串的copy,我们对象的内存地址没有改变,只是指针的地址改变了,所以在这里我们默认进行了一次浅拷贝,只拷贝了指针。

      • 方案二:copy可变的字符串

        NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"];
        NSString*copyStr1 = [str1 copy];
        NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1);
        NSLog(@"str1 = %p copyStr1= %p",&str1,&copyStr1);

        输出结果:str1 = 0x7fa522712cd0 copyStr1 = 0x7fa522717ba0
        指针地址:str1 = 0x7fff529e9a98 copyStr1= 0x7fff529e9a90
        小结:对可变字符串的copy,我们默认进行了一次深拷贝,直接拷贝了对象。

      • 方案三:mutableCopy不可变字符串的
        NSString*str2 = @"ccc";
        NSMutableString *copyStr2 = [str2 mutableCopy];
        NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);
        输出结果:str2 = 0x10d216108 copyStr2 = 0x7fa522726290
        小结:对于不可变字符串的mutableCopy我们默认进行了深拷贝。
      • 方案四:mutableCopy可变字符串
        NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"];
        NSMutableString*copyStr3 = [str3 mutableCopy];
        NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);
        输出结果:str3 = 0x7fa5227153c0 copyStr3 = 0x7fa5227263f0
        小结:对于可变字符串的mutableCopy我们默认进行了深拷贝。

    三、结论

      • copy:因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝
      • mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。 无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,切他们之前不会相互影响。
  • 相关阅读:
    字符串通配
    最短排序
    最长回文子串
    添加回文串
    找零钱
    最优编辑
    01背包
    PHP做分页查询(查询结果也显示为分页)
    PHP 练习3:租房子
    Html5学习3(拖放、Video(视频)、Input类型(color、datetime、email、month 、number 、range 、search、Tel、time、url、week ))
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5060889.html
Copyright © 2011-2022 走看看