您的位置:首页 > 运维架构

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

2015-10-29 11:57 253 查看
  本文主要研究对不可变对象和可变对象分别进行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,长生新的对象,该对象是可变的。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: