美文网首页
深拷贝和浅拷贝之容器类对象

深拷贝和浅拷贝之容器类对象

作者: 哲逗年 | 来源:发表于2017-06-23 11:39 被阅读0次
还是那么美还是那么美

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。

相关文章

  • 深拷贝和浅拷贝不同

    浅拷贝:指针(地址)拷贝,不会产生新对象深拷贝:内容拷贝,会产生新对象 非容器类对象的深拷贝、浅拷贝 非容器类对象...

  • iOS相关 | oc中深拷贝和浅拷贝,copy和strong

    oc中对象的拷贝分为浅拷贝和深拷贝,又分为容器类对象和非容器类对象 1.对非容器类对象(如NSString、NSM...

  • Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝。说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面...

  • 深拷贝/浅拷贝详谈

    定义 深拷贝:对指针和对象本身进行了拷贝 浅拷贝:只拷贝了指针,并未拷贝对象本身 使用场景 对非容器类对象(如NS...

  • 深拷贝和浅拷贝之容器类对象

    1.对不可变对象进行copy操作 结果:两个数组地址是相同的,说明是浅copy,同时对两个数组的内部元素作打印,结...

  • PHP之剑走偏锋的DeepCopy

    php的深拷贝和浅拷贝问题,普通变量对象的赋值 = 是深拷贝,& 是浅拷贝。 输出结果: 类对象的拷贝问题就得看下...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 深拷贝和浅拷贝之非容器类对象

    1.对可变对象进行copy操作 结果: 结论:对可变对象进行copy操作是内容copy(深copy)猜想:如果将N...

网友评论

      本文标题:深拷贝和浅拷贝之容器类对象

      本文链接:https://www.haomeiwen.com/subject/istccxtx.html