1.copy基本概念
-
什么是copy
- Copy的字面意思是“復(fù)制”、“拷貝”杂数,是一個產(chǎn)生副本的過程
-
常見的復(fù)制有:文件復(fù)制
- 作用:利用一個源文件產(chǎn)生一個副本文件
-
特點:
- 修改源文件的內(nèi)容,不會影響副本文件
- 修改副本文件的內(nèi)容彻磁,不會影響源文件
-
OC中的copy
- 作用:利用一個源對象產(chǎn)生一個副本對象
-
特點:
- 修改源對象的屬性和行為留凭,不會影響副本對象
- 修改副本對象的屬性和行為,不會影響源對象
2.Copy的使用
-
如何使用copy功能
- 一個對象可以調(diào)用copy或mutableCopy方法來創(chuàng)建一個副本對象
- copy : 創(chuàng)建的是不可變副本(如NSString升略、NSArray微王、NSDictionary)
- mutableCopy :創(chuàng)建的是可變副本(如NSMutableString、NSMutableArray品嚣、NSMutableDictionary)
-
使用copy功能的前提
- copy : 需要遵守NSCopying協(xié)議炕倘,實現(xiàn)copyWithZone:方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
- 使用mutableCopy的前提
- 需要遵守NSMutableCopying協(xié)議,實現(xiàn)mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
3.深復(fù)制和淺復(fù)制
- 淺復(fù)制(淺拷貝翰撑,指針拷貝罩旋,shallow copy)
- 源對象和副本對象是同一個對象
- 源對象(副本對象)引用計數(shù)器+1,相當(dāng)于做一次retain操作
- 本質(zhì)是:沒有產(chǎn)生新的對象
NSString *srcStr = @"cwj";
NSString *copyStr = [srcStr copy];
NSLog(@"src = %p, copy = %p", srcStr, copyStr);
- 深復(fù)制(深拷貝,內(nèi)容拷貝眶诈,deep copy)
- 源對象和副本對象是不同的兩個對象
- 源對象引用計數(shù)器不變,副本對象計數(shù)器為1(因為是新產(chǎn)生的)
- 本質(zhì)是:產(chǎn)生了新的對象
NSString *srcStr = @"cwj";
NSMutableString *copyStr = [srcStr mutableCopy];
NSLog(@"src = %p, copy = %p", srcStr, copyStr);
NSLog(@"src = %@, copy = %@", srcStr, copyStr);
[copyStr appendString:@" love"];
NSLog(@"src = %@, copy = %@", srcStr, copyStr);
NSMutableString *srcStr = [NSMutableString stringWithFormat:@"cwj"];
NSString *copyStr = [srcStr copy];
[srcStr appendString:@" love"];
NSLog(@"src = %p, copy = %p", srcStr, copyStr);
NSLog(@"src = %@, copy = %@", srcStr, copyStr);
NSMutableString *srcStr = [NSMutableString stringWithFormat:@"cwj"];
NSMutableString *copyStr = [srcStr mutableCopy];
[srcStr appendString:@" love"];
[copyStr appendString:@" abc"];
NSLog(@"src = %p, copy = %p", srcStr, copyStr);
NSLog(@"src = %@, copy = %@", srcStr, copyStr);
- 只有源對象和副本對象都不可變時涨醋,才是淺復(fù)制,其它都是深復(fù)制