iOS 了解深拷贝和浅拷贝
一、概念与总结
1、浅拷贝
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。
浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对 象。
2、深拷贝
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
二、示例分析
oc 在iOS中深拷贝与浅拷贝要更加的复杂,涉及到容器与非容器、可变与不可变对象的copy与mutableCopy。下面用示例逐一分析:
1、非集合对象的copy与mutableCopy
1.1 不可变对象NSString
-(void) noMutableNSStringTest
{
NSString *str1 = @"test001";
NSMutableString *str2 = [str1 copy];
//copy返回的是不可变对象,str2不能被修改,因此会发生崩溃
//[str2 appendString:@"test"];
NSMutableString *str3 = [str1 mutableCopy];
[str3 appendString:@"modify"];
Log(@"str1:%p - %@ \r\n",str1,str1);
NSLog(@"str2:%p - %@ \r\n",str2,str2);
NSLog(@"str3:%p - %@ \r\n",str3,str3);
}
打印结果:
2017-07-18:02:10.642beck.wang[1306:169414]str1:0x106abdbd0 - test001 2017-07-20 18:02:10.643 beck.wang[1306:169414] str2:0x106abdbd0 - test001 2017-07-20 18:02:10.643 beck.wang[1306:169414] str3:0x608000260940 - test001modify
分析:'str1、str2地址相同并且与str3地址不同,NSString的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝.'
1.2 可变对象NSMutableString
实例代码
-(void) noMutableNSStringTest
{
NSString *str1 = @"test001";
NSMutableString *str2 = [str1 copy];
//copy返回的是不可变对象,str2不能被修改,因此会发生崩溃
//[str2 appendString:@"test"];
NSMutableString *str3 = [str1 mutableCopy];
[str3 appendString:@"modify"];
NSLog(@"str1:%p - %@ \r\n",str1,str1);
NSLog(@"str2:%p - %@ \r\n",str2,str2);
NSLog(@"str3:%p - %@ \r\n",str3,str3)
}
打印结果:
2017-07-20 18:02:10.642beck.wang[1306:169414]str1:0x106abdbd0 - test001
2017-07-20 18:02:10.643 beck.wang[1306:169414] str2:0x106abdbd0 - test001
2017-07-20 18:02:10.643 beck.wang[1306:169414] str3:0x608000260940 - test001modify
> 分析:*str1、str2地址相同并且与str3地址不同,NSString的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝*
网友评论