深拷贝和浅拷贝之容器类对象
1.对不可变对象进行copy操作
@property (nonatomic, strong) NSArray *strongArray;
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
NSString *str2 = @"str2";
NSString *str3 = @"str3";
NSArray *array = @[str1,str2,str3];
//等价于self.strongArray = [array copy];
self.strongArray = array;
NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
结果:两个数组地址是相同的,说明是浅copy,同时对两个数组的内部元素作打印,结果也是指向的同一份地址,说明数组里面的元素也是浅copy,建议用这种写法。
结合上一章文章,对str1进行进一步的操作:
1.[str1 appendString:@"append"];
结果:可想而知两个数组里面的元素也会
随之改变
2.str1 = [[NSMutableString alloc] initWithString:@"str6"];
结果:可想而知两个数组里面的元素不会
随之改变
接下来将strongArray改为NSMutableArray会怎么样???
结论其实是同上的,唯一不同的是如果对array进行copy时,进行如下操作:
[self.strongArray removeLastObject];
是会崩溃的喔,原因其实可以参考非容器类的那篇文章
2.对不可变对象进行mutableCopy操作
@property (nonatomic, strong) NSArray *strongArray;
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
NSString *str2 = @"str2";
NSString *str3 = @"str3";
NSArray *array = @[str1,str2,str3];
self.strongArray = [array mutableCopy];
NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
结果:两个数组地址是不一样的,说明对不可变对象进行mutableCopy是深copy,同时对两个数组内的元素作打印,结果是指向的同一份地址,说明数组里面的元素还是浅copy。
接下来将strongArray改为NSMutableArray会怎么样???
结果:结论同上,是内容copy(深copy),里面的元素都是指针copy(浅copy),但是可以对strongArray可以进行正常的增删操作。
3.对可变对象进行copy操作
@property (nonatomic, strong) NSArray *strongArray;
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
NSString *str2 = @"str2";
NSString *str3 = @"str3";
NSMutableArray *array = [NSMutableArray arrayWithArray:@[str1,str2,str3]];
self.strongArray = [array copy];
NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
结果:两个数组地址是不一样的,说明对可变对象进行copy操作,是内容copy(深copy);同是对两个数组的内部元素分别作打印,其实指向的都是同一份地址,说明数组里面的元素还是指针copy(浅copy)。
接下来将strongArray改为NSMutableArray会怎么样???
结论还是一样的,虽然strongArray定义是NSMutableArray,但是不可以进行[self.strongArray removeLastObject];
等操作哦,因为编译时是没有任何问题的,但是一运行是会崩溃的。
4.对可变对象进行mutableCopy操作
@property (nonatomic, strong) NSArray *strongArray;
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
NSString *str2 = @"str2";
NSString *str3 = @"str3";
NSMutableArray *array = [NSMutableArray arrayWithArray:@[str1,str2,str3]];
self.strongArray = [array mutableCopy];
NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
结果:两个数组地址是不一样的,说明是内容copy(深copy),里面的元素是(指针copy)浅copy。
ps:虽然对array进行了mutableCopy操作,但是strong是NSArray类型的,还是不可以增删操作的,因为编译的时候就会报错。
接下来将strongArray改为NSMutableArray会怎么样???
结果:结论同上,这种写法是最正确的,因为你可以正常对数组进行增删操作,并不会影响另一个数组,但是如果是修改数组里面的元素,是会影响的喔,因为是指针copy。