以下是本人自己的总结及验证。
总结:对于copy(浅拷贝):如果被拷贝的对象是可变的,则被赋予的对象会指向系统重新分配的与被拷贝的对象有相同内容的不同内存。如果被拷贝的对象是不可变的,则被赋予的对象与被拷贝的对象指向同一块内存。
eg:A=[B copy] : 如果B是可变对象,则A会指向系统重新分配的与B有相同内容的新内存。如果B是不可变对象,则A会指向与B指向相同的同一块内存。
对于MutableCopy(深拷贝):无论被拷贝的对象是可变对象还是不可变对象,被赋予的对象都会指向系统重新分配的与被拷贝的对象有相同内容的不同内存。
eg:A=[B MutableCopy]:无论B是可变对象还是不可变对象,A都会指向系统重新分配的与B有相同内容的不同内存。
以下是验证:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
#pragma mark - Life Cycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self notContainerClass];
[self containerClass];
//总结:对于浅拷贝(copy)如果被拷贝的对象是可变的则会指向系统重新分配的与被拷贝的对象有相同内容的不同内存,如果被拷贝的对象是不可变的则会指向同一块内存
//对于深拷贝(mutableCopy)无论对象是可变的还是不可变的都会指向系统重新分配的与被拷贝的对象有相同内容的不同内存
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - Private Method
/**
* 非容器类 如:NSString NSNumber
*/
-(void)notContainerClass
{
//对于不可变字符串对象的拷贝
//浅拷贝(copy)会指向同一块内存
//深拷贝(mutableCopy)则会指向另一块有相同内容的新内存(即系统会重新分配一块有相同内容的内存)
NSString *str1=@"试问谁可,洁白无比";
//content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
NSLog(@"content=%@ add=%p class=%@",str1,str1,[str1 class]);
NSString *str1Copy=[str1 copy];
//content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
NSLog(@"content=%@ add=%p class=%@",str1Copy,str1Copy,[str1Copy class]);
NSMutableString *str1M=[str1 mutableCopy];
//content=试问谁可,洁白无比 add=0x7f82404a0bf0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",str1M,str1M,[str1M class]);
str1=@"海阔天空";
// content=海阔天空 add=0x10dfbc0a8 class=__NSCFConstantString
NSLog(@"content=%@ add=%p class=%@",str1,str1,[str1 class]);
//content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
NSLog(@"content=%@ add=%p class=%@",str1Copy,str1Copy,[str1Copy class]);
//content=试问谁可,洁白无比 add=0x7f82404a0bf0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",str1M,str1M,[str1M class]);
//对于可变字符串对象的拷贝 无论深拷贝还是浅拷贝系统都会重新分配一块有相同内容的新内容
NSMutableString *test1=[NSMutableString stringWithFormat:@"试问谁可,洁白无比"];
//content=试问谁可,洁白无比 add=0x7fe2307413e0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",test1,test1,[test1 class]);
NSString *testCopy=[test1 copy];
//content=试问谁可,洁白无比 add=0x7fe230741540 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",testCopy,testCopy,[testCopy class]);
NSString *testM=[test1 mutableCopy];
//content=试问谁可,洁白无比 add=0x7fe23073ef60 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",testM,testM,[testM class]);
NSMutableString *mTestM=[test1 mutableCopy];
//content=试问谁可,洁白无比 add=0x7fe230729eb0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",mTestM,mTestM,[mTestM class]);
[test1 appendString:@"你好,阳光"];
//content=试问谁可,洁白无比你好,阳光 add=0x7fe2307413e0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",test1,test1,[test1 class]);
//content=试问谁可,洁白无比 add=0x7fe230741540 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",testCopy,testCopy,[testCopy class]);
//content=试问谁可,洁白无比 add=0x7fe23073ef60 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",testM,testM,[testM class]);
//content=试问谁可,洁白无比 add=0x7fe230729eb0 class=__NSCFString
NSLog(@"content=%@ add=%p class=%@",mTestM,mTestM,[mTestM class]);
}
/**
* 容器类 如:NSArray
*/
-(void)containerClass
{
//对于不可变数组对象的拷贝
//浅拷贝会指向同一块有相同内容的内存
//深拷贝会指向有相同内容的不同内存
NSArray *array1=@[@"color",@"sun"];
// copy、mutableCopy[7316:65512] content=(
// color,
// sun
// ) add=0x7f9439ea1900 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",array1,array1,[array1 class]);
NSArray *arrayCopy=[array1 copy];
// content=(
// color,
// sun
// ) add=0x7f9439ea1900 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",arrayCopy,arrayCopy,[arrayCopy class]);
NSMutableArray *arrayM=[array1 mutableCopy];
// content=(
// color,
// sun
// ) add=0x7f9439c02e40 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",arrayM,arrayM,[arrayM class]);
array1=@[@"hello,world"];
// content=(
// "hello,world"
// ) add=0x7f9439c03b60 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",array1,array1,[array1 class]);
// content=(
// color,
// sun
// ) add=0x7f9439ea1900 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",arrayCopy,arrayCopy,[arrayCopy class]);
// content=(
// color,
// sun
// ) add=0x7f9439c02e40 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",arrayM,arrayM,[arrayM class]);
//对于可变数组对象的拷贝 无论copy、mutableCopy都会指向不同的有相同内容的内存(即系统会重新分配与被拷贝的对象有相同内容的内存)
NSMutableArray *mArray1=[[NSMutableArray alloc] initWithObjects:@"color",@"sun", nil];
// content=(
// color,
// sun
// ) add=0x7fc3bb518a60 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",mArray1,mArray1,[mArray1 class]);
NSArray *mArray1Copy=[mArray1 copy];
// content=(
// color,
// sun
// ) add=0x7fc3bb785a50 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",mArray1Copy,mArray1Copy,[mArray1Copy class]);
NSMutableArray *mArray1M=[mArray1 mutableCopy];
// content=(
// color,
// sun
// ) add=0x7fc3bb786df0 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",mArray1M,mArray1M,[mArray1M class]);
[mArray1 addObject:@"hello,world"];
// content=(
// color,
// sun,
// "hello,world"
// ) add=0x7fc3bb518a60 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",mArray1,mArray1,[mArray1 class]);
// content=(
// color,
// sun
// ) add=0x7fc3bb785a50 class=__NSArrayI
NSLog(@"content=%@ add=%p class=%@",mArray1Copy,mArray1Copy,[mArray1Copy class]);
// content=(
// color,
// sun
// ) add=0x7fc3bb786df0 class=__NSArrayM
NSLog(@"content=%@ add=%p class=%@",mArray1M,mArray1M,[mArray1M class]);
}
@end