关于copy、mutableCopy的讨论(2)

作者: hanl001 | 来源:发表于2016-12-25 11:19 被阅读93次
上一篇是关于OC中字符串的copy、mutablecopy的讨论,本篇将对集合类型进行讨论,以NSArray为例

带着问题我们进行如下讨论: 测试代码

1、NSArray的copy

     NSArray *arr = @[@"1",@"2",@"3"];
    NSLog(@"%p",arr);
    
    NSArray *arrCopy1 = [arr copy];
    NSLog(@"%p",arrCopy1);
    
    NSMutableArray *arrCopy2 = (NSMutableArray *)[arr copy];
    NSLog(@"%p",arrCopy2);
    
    NSArray *arrCopy3 = [arr copy];
    NSLog(@"%p",arrCopy3);
    
    NSMutableArray *arrCopy4 = [arr copy];
    NSLog(@"%p",arrCopy4);

控制台输出如下

Snip20161225_23.png

NSArray的copy和NSString的copy一样
只是相当于“强引用” ,也就是浅拷贝。


copy后的数组类型

2、NSArray的mutableCopy

  
   NSArray *arr = @[@"1",@"2",@"3"];
    NSLog(@"%p",arr);
    
    NSArray *arrCopy1 = [arr mutableCopy];
    NSLog(@"%p",arrCopy1);
    
    NSMutableArray *arrCopy2 = [arr mutableCopy];
    NSLog(@"%p",arrCopy2);
    
    NSArray *arrCopy3 = [arr mutableCopy];
    NSLog(@"%p",arrCopy3);
    
    NSMutableArray *arrCopy4 = [arr mutableCopy];
    NSLog(@"%p",arrCopy4);

控制台输出如下


每一个mutableCopy的数组,地址都不同

他们都是可变数组

Snip20161225_26.png

3、NSMutableArray的copy

   NSArray *arr = @[@"1",@"2",@"3"];
    NSLog(@"%p",arr);
    NSArray *mutArr = [arr mutableCopy];
    NSLog(@"%p",mutArr);
    
    NSArray *arrCopy1 = [mutArr copy];
    NSLog(@"%p",arrCopy1);
    
    NSMutableArray *arrCopy2 = (NSMutableArray *)[mutArr copy];
    NSLog(@"%p",arrCopy2);
    
    NSArray *arrCopy3 = [mutArr copy];
    NSLog(@"%p",arrCopy3);
    
    NSMutableArray *arrCopy4 = [mutArr copy];
    NSLog(@"%p",arrCopy4);

控制台输出如下

Snip20161225_28.png
内存地址信息如下
Snip20161225_27.png
对NSMutableArray进行copy操作之后,得到的依然是不可变数组,</br>与NSMutableString的copy不同的是,每次copy都会得到一个不同的地址

4、NSMutableArray的mutableCopy

    NSArray *arr = @[@"1",@"2",@"3"];
    NSLog(@"%p",arr);
    NSArray *mutArr = [arr mutableCopy];
    NSLog(@"%p",mutArr);
    
    NSArray *arrCopy1 = [mutArr mutableCopy];
    NSLog(@"%p",arrCopy1);
    
    NSMutableArray *arrCopy2 = [mutArr mutableCopy];
    NSLog(@"%p",arrCopy2);
    
    NSArray *arrCopy3 = [mutArr mutableCopy];
    NSLog(@"%p",arrCopy3);
    
    NSMutableArray *arrCopy4 = [mutArr mutableCopy];
    NSLog(@"%p",arrCopy4);

控制台输出如下


Snip20161225_30.png

内存地址信息如下


Snip20161225_29.png
对NSMutableArray进行mutableCopy操作之后,得到的依然是不可变数组,而且每次mutableCopy都会得到一个不同的地址
总结:
  1. copy产生不可变类型,mutableCopy产生可变类型;
  2. 只要mutablecopy就会开辟空间;
  3. copy不可变数组相当于强引用,不会开辟空间;
  4. copy可变数组会开辟空间;

从这里可以看出集合类型的copy与NSString非常类似,在使用NSArray引用NSMuableArray的时候也要使用copy
例如:

- (NSArray *)array {
    NSMutableArray *mutArr = [NSMutableArray array];
    [mutArr addObject:@"1"];
    return [mutArr copy];
}

- (NSMutableArray *)mutableArray {
    NSArray *arr = @[@"1",@"2",@"3"];
    
    return [arr mutableCopy];
//    return [NSMutableArray arrayWithArray:arr]; //Foundation提供的方法
}

相关文章

网友评论

    本文标题:关于copy、mutableCopy的讨论(2)

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