本文主要研究对不可变对象和可变对象分别进行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,长生新的对象,该对象是可变的。