今天说一下深拷贝和浅拷贝
声明本文仅供参考,因为作者能力有限不能做到十全十美,所以请大家指正错误的地方,欢迎大家提出问题,我回虚心接纳!
copy的目的是建立一个对象的副本,对其中一个对象进行修改时,不会影响到另外一个对象中的内容
在iOS中copy包括:copy(拷贝) & mutableCopy(可变拷贝)
由于OC Foundation中对象类型通常包括不可变版本和可变版本,因此要试验copy操作需要测试几种形式:
1> 可变 -> 可变 地址变化(新副本)
2> 可变 -> 不可变 地址变化(新副本)
3> 不可变 -> 可变 地址不变化
4> 不可变 -> 不可变 地址不变化
下面我们来看代码:
void demoCopy1()
{
NSMutableString *strM = [NSMutableStringstringWithString:@"闪电霹雳"];
// 1> 可变 -> 可变
NSMutableString *strM1 = [strM copy];
// [strM1 setString:@"hello"];
NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);
// 2> 可变 -> 不可变
NSString *strM2 = [strM copy];
NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);
[strM setString:@"hello"];
NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);
NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);
}
这时候你会发现上面NSMutableSting拷贝过后就在strM1赋值的时候就会报错,第2>个也是给strM2赋值的时候也回报错
接下来再看案例2
void demoCopy2()
{
NSString *str = @"闪电霹雳";
// 1> 不可变 -> 可变
NSMutableString *strM1 = [str copy];
// [strM1 setString:@"hello"];
NSLog(@"%@ %p - %@ %p", str, str, strM1, strM1);
// 2> 不可变 -> 不可变
NSString *strM2 = [str copy];
NSLog(@"%@ %p - %@ %p", str, str, strM2, strM2);
}
这时候同样,不管是NSMutableString还是Nstring拷贝过后的都不能再改变,同样不能赋值,如果赋值改变就会出错;
结论:使用Copy建立出来的都是不可变的的副本,与创建的副本类型无关;
接下来看事例3
void demoCopy3()
{
NSMutableString *strM = [NSMutableStringstringWithString:@"可变字符串"];
// 1> 可变 -> 可变
NSMutableString *strM1 = [strM mutableCopy];
[strM1 setString:@"hello strM1"];
NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);
// 2> 可变 -> 不可变
NSString *strM2 = [strM mutableCopy];
NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);
id strM3 = strM2;
[strM3 setString:@"hello strM2"];
[strM setString:@"hello"];
NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);
NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);
}
这次你回发现拷贝过后不管是哪一个类型都可改变;
结论:使用mutableCopy建立出来的都是可变副本,与创建副本的类型无关
好了,深拷贝浅拷贝到这里就OK了,有没有对copy有根深的一层了解呢?哈哈这里恭祝大家天天进步!!如有疑问可以联系我,我回尽自己的能力帮助大家!!
原文地址:http://www.cnblogs.com/dream999/p/3762833.html