内存管理-深浅拷贝之 copy和mutableCopy

  本文主要研究对不可变对象和可变对象分别进行copy,mutableCopy,对产生的结果,进行探讨内存地址以及是否可变。

  好吧,说的拗口了,先贴结论

  

上代码:

一、对不可变对象拷贝

NSString * str1=[NSString stringWithFormat:@"str1"];

//    1、定义一个不可变数组
    NSArray *arrImult=[NSArray arrayWithObject:str1];

//    2、对不可变数组进行copy和mutableCopy
    NSMutableArray *arrCopy=[arrImult copy];
    NSMutableArray *arrMultCopy=[arrImult mutableCopy];
    
//    3、打印地址
    NSLog(@"%p",str1);
    NSLog(@"%p",arrImult);
    NSLog(@"arrCopy--->%p",arrCopy);
    NSLog(@"arrMultCopy--->%p",arrMultCopy);
    
//    4、尝试改变
  
    [arrMultCopy  addObject:@"arrMultCopy"];
    NSLog(@"%@",arrMultCopy);
    
    [arrCopy addObject:@"arrCopy"];//程序崩溃,报错
     NSLog(@"%@",arrCopy);

 打印信息:

2015-10-29 11:53:24.130 test123[1182:152126] 0x7fbfe8d60790

2015-10-29 11:53:24.130 test123[1182:152126] 0x7fbfe8d60550

2015-10-29 11:53:24.131 test123[1182:152126] arrCopy--->0x7fbfe8d60550

2015-10-29 11:53:24.131 test123[1182:152126] arrMultCopy--->0x7fbfe8d28bc0

2015-10-29 11:53:24.131 test123[1182:152126] (

    str1,

    arrMultCopy

)

最后一个打印报错的信息。。。。

    结论:

    1、对不可变的对象做  copy,得到的是不可变对象的地址,浅拷贝,拷贝指针,所以,没有产生新对象,依旧不可变;

    2、对不可变的对象做  mutableCopy ,产生新的对象,该对象是可变的。

二、对可变对象进行拷贝

    NSString * str1=[NSString stringWithFormat:@"str1"];
//    1、定义一个可变数组
    NSMutableArray * arrMult=[NSMutableArray arrayWithObject:str1];
//    2、对可变数组进行 copy 和mutableCopy
    NSMutableArray * arrCopy=[arrMult copy];
    NSMutableArray * arrMultCopy=[arrMult mutableCopy];
    
//    3、打印地址
    NSLog(@"arrMult-->%p",arrMult);
    NSLog(@"arrCopy-->%p",arrCopy);
    NSLog(@"arrMultCopy-->%p",arrMultCopy);
//    4、尝试改变
    [arrMultCopy addObject:@"arrMultCopy"];
    NSLog(@"%@",arrMultCopy);
    
    [arrCopy addObject:@"arrCopy"];//程序崩溃,报错
    NSLog(@"%@",arrCopy);
    

 打印结果:

2015-10-29 11:39:27.608 test123[1091:145654] arrMult-->0x7fbbe25a0ae0

2015-10-29 11:39:27.609 test123[1091:145654] arrCopy-->0x7fbbe25a01e0

2015-10-29 11:39:27.609 test123[1091:145654] arrMultCopy-->0x7fbbe25a0500

2015-10-29 11:39:27.609 test123[1091:145654] (

    str1,

    arrMultCopy

)

最后一个打印的报错信息。。。

结论:

    3、对可变对象做  copy,得到的是新地址,也就是说,产生了新对象,但是,新对象是不可变的;

    4、对可变对象做  mutableCopy,长生新的对象,该对象是可变的。

  

原文地址:https://www.cnblogs.com/panyuluoye/p/4920012.html