iOS 基础知识专题1 —— copy、mutableCopy

copy and mutableCopy

接下来会按照专题的方式,写一些 iOS 基础基础知识的文章,有些是从电脑里以前的笔记摘出来的。本片文章是关于copy、mutableCopy的总结。

先看以下几段代码:

  1. 对 NSString 做 copy、mutableCopy:

    NSString *str1 = @"123";
    NSString *copyStr1 = [str1 copy];
    NSMutableString *mutableStr1 = [str1 mutableCopy];
    
    NSLog(@"%p",str1);           // 0x108159088
    NSLog(@"%p",copyStr1);       // 0x108159088
    NSLog(@"%p",mutableStr1);    // 0x60c00024d050
    

    结论:对 NSString 做 copy 得到的对象地址不变,做mutableCopy,地址会变

  2. 对 MutableString 做 copy、mutableCopy:

    // NSMutableString
    NSMutableString *str2 = [NSMutableString stringWithString:@"123"];
    NSString *copyStr2 = [str2 copy];
    NSMutableString *mutableStr2 = [str2 mutableCopy];
    
    NSLog(@"%p",str2);           // 0x60c000245670
    NSLog(@"%p",copyStr2);       // 0xa000000003332313
    NSLog(@"%p",mutableStr2);    // 0x60c000245940
    

    结论:对 NSMutableString 做 copy、mutableCopy地址都会变。

  3. 对 NSArray 做 copy、mutableCopy:

    // NSArray
    NSArray *array1 = [NSArray arrayWithObject:@"1"];
    NSArray *copyArray1 = [array1 copy];
    NSMutableArray *mutableCopyArray1 = [array1 mutableCopy];
    
    NSLog(@"%p",array1);                // 0x60c000015de0
    NSLog(@"%p",copyArray1);            // 0x60c000015de0
    NSLog(@"%p",mutableCopyArray1);     // 0x60c0000567a0
    

    结论:对 NSArray 做 copy 得到的对象地址不变,做mutableCopy,地址会变,和String情况一样

  4. 对 NSMutableArray 做 copy、mutableCopy:

    // NSMutableArray
    NSMutableArray *array2 = [NSMutableArray arrayWithObject:@"1"];
    NSArray *copyArray2 = [array2 copy];
    NSMutableArray *mutableCopyArray2 = [array2 mutableCopy];
    
    NSLog(@"%p",array2);                // 0x604000255390
    NSLog(@"%p",copyArray2);            // 0x60400001c2d0
    NSLog(@"%p",mutableCopyArray2);     // 0x604000255210
    

    结论:对 NSMutableArray 做 copy、mutableCopy地址都会变。

总结一下:

  1. copy 返回不可变对象,对于“不可变对象“做 copy,地址不变。对于”可变对象“做 copy,地址改变(一定是两个不同对象,可变不可变能力都变了)。
  2. mutableCopy返回可变对象,无论对”可变对象“还是”不可变对象“,做 mutableCopy,地址都会改变。
  3. 也正说明了,为什么一个属性定义成copy的时候,比较安全,因为赋值的时候,相当于加上了 [XXX copy] 比如 @property (nonatomic, copy) NSString *m_string; 所以如果赋值过来的是一个可变对象,也就是对可变对象做copy,会新生成一个对象赋值给 m_string,那么即使原本的可变对象改变了,也不影响 m_string 的变化。
X copy mutableCopy
可变对象 地址不变 地址改变
不可变对象 地址改变 地址改变
posted @ 2018-03-04 20:39  张驰小方块  阅读(149)  评论(0编辑  收藏  举报