在Foundation框架中,常用的几个类,如NSString、NSArray以及NSDictionary都有其对应的可变子类。当对不同类的对象进行复制时,系统会采用不同的复制方式,有的采用浅复制,有的采用深复制,因此有必要去提前了解对不同类型的对象进行复制时,得到的拷贝结果是拷贝的指针(浅复制),还是具体的内容(深复制)。
1、拷贝操作(copy与mutableCopy方法)
在NSObject类中提供了两种复制的实例方法,copy和mutableCopy。copy方法,得到的是不可变对象,不管以前的是可变还是不可变。mutableCopy方法,得到的是可变对象,不管以前的是可变还是不可变。
当对不同类型的对象分别使用copy和mutableCopy方法进行复制时,可能对应不同的复制类型(深复制OR浅复制)。
-(id)copy;
-(id)mutableCopy;
2、可变对象与不可变对象
在Foundation框架中,常用的几个不可变的类,如NSString,NSArray,NSDictionary都有对应的可变子类(NSMutableString,NSMutableArray,NSMutableDictionary)。
不可变的类实例化后的对象,分配的内存空间不能再变化,而可变类实例化后的对象,分配的内存可以动态变化。因此,我们可以修改一个可变字符串的内容,或者在一个可变数组中新增/删除其中的对象。
3、容器类与非容器类
容器类就是该类的对象可以用来容纳其他对象,最典型的是数组NSArray以及NSMutableArray。
非容器类的对象不能够容纳其他对象,例如,字符串。
4、非容器类且不可变对象的拷贝
结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制
示例代码:
voidcopyTest1(){
NSLog(@"非容器类不可变对象复制");
NSString*string=@"宏创学院";
NSString*string1=[stringcopy];
NSString*string2=[stringmutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSStringclass],string,string1,string2);
NSLog(@"结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制");
}
运行结果:
5、非容器类且可变对象的拷贝
结论:非容器类可变对象:copy->深复制, mutableCopy->深复制
示例代码:
/**
* 非容器类可变对象复制
*/
voidcopyTest2(){
NSLog(@"非容器类可变对象");
NSMutableString*string=[NSMutableStringstringWithFormat:@"宏创学院"];
NSMutableString*string1=[stringcopy];
NSMutableString*string2=[stringmutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableStringclass],string,string1,string2);
NSLog(@"结论:非容器类可变对象:copy->深复制, mutableCopy->深复制");
}
运行结果:
6、容器类且不可变对象的拷贝
结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制
示例代码:
/**
* 容器类不可变对象复制
*/
voidcopyTest3(){
NSLog(@"容器类不可变对象复制");
NSString*string=@"宏创学院";
NSArray*array=[NSArrayarrayWithObjects:string,nil];
NSArray*array1=[array copy];
NSArray*array2=[array mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSArrayclass],array,array1,array2);
NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p",string,array[0],array1[0],array2[0]);
NSLog(@"结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制");
}
运行结果:
7、容器类且可变对象的拷贝
结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制
示例代码:
/**
* 容器类可变对象复制
*/
voidcopyTest4(){
NSLog(@"容器类可变对象复制");
NSMutableString*string=[NSMutableStringstringWithFormat:@"宏创学院"];
NSMutableArray*array=[NSMutableArrayarrayWithObjects:string,nil];
NSMutableArray*array1=[array copy];
NSMutableArray*array2=[array mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableArrayclass],array,array1,array2);
NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p",string,array[0],array1[0],array2[0]);
NSLog(@"结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制");
}
运行结果: