OC对象复制:2-可变对象与不可变对象复制

在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->深复制, 容器内的对象->浅复制");

}

运行结果:

你可能感兴趣的:(OC对象复制:2-可变对象与不可变对象复制)