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->深复制
示例代码:
void copyTest1 () {
NSLog(@"非容器类不可变对象复制");
NSString *string = @"九九学院";
NSString *string1 = [string copy];
NSString *string2 = [string mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSString class], string, string1, string2);
NSLog(@"结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制");
}
运行结果:
5、非容器类且可变对象的拷贝
结论:非容器类可变对象:copy->深复制, mutableCopy->深复制
示例代码:
/**
* 非容器类可变对象复制
*/
void copyTest2 () {
NSLog(@"非容器类可变对象");
NSMutableString *string = [NSMutableString stringWithFormat:@"九九学院"];
NSMutableString *string1 = [string copy];
NSMutableString *string2 = [string mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableString class], string, string1, string2);
NSLog(@"结论:非容器类可变对象:copy->深复制, mutableCopy->深复制");
}
运行结果:
6、容器类且不可变对象的拷贝
结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制
示例代码:
/**
* 容器类不可变对象复制
*/
void copyTest3 () {
NSLog(@"容器类不可变对象复制");
NSString *string = @"九九学院";
NSArray *array = [NSArray arrayWithObjects:string, nil];
NSArray *array1 = [array copy];
NSArray *array2 = [array mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】", [NSArray class], 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->深复制, 容器内的对象->浅复制
示例代码:
/**
* 容器类可变对象复制
*/
void copyTest4 () {
NSLog(@"容器类可变对象复制");
NSMutableString *string = [NSMutableString stringWithFormat:@"九九学院"];
NSMutableArray *array = [NSMutableArray arrayWithObjects:string, nil];
NSMutableArray *array1 = [array copy];
NSMutableArray *array2 = [array mutableCopy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】", [NSMutableArray class], 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->深复制, 容器内的对象->浅复制");
}
运行结果:
示例代码
https://github.com/99ios/6.1.2
最后编辑时间为: September 6th , 2017 at 10:53 am
本文由 99ios 创作,转载请注明出处