轉(zhuǎn)載自https://my.oschina.net/aofe/blog/266677
摘要: 在Objective-C中,一個對象可以調(diào)用copy或mutableCopy方法來創(chuàng)建一個副本對象,本文著重講解如何正確使用copy的功能.
首先,什么是copy的妖?
Copy的字面意思是“復制”绅喉、“拷貝”,是一個產(chǎn)生副本的過程颈抚。
常見的復制有:文件復制踩衩,作用是利用一個源文件產(chǎn)生一個副本文件。
特點:1贩汉、修改源文件的內(nèi)容驱富,不會影響副本文件;
2匹舞、修改副本文件的內(nèi)容褐鸥,不會影響源文件。
OC中copy的作用是:利用一個源對象產(chǎn)生一個副本對象
特點:1赐稽、修改源對象的屬性和行為叫榕,不會影響副本對象浑侥;
2、修改副本對象的屬性和行為晰绎,不會影響源對象寓落。
如何使用copy功能?
一個對象可以調(diào)用copy或mutableCopy方法來創(chuàng)建一個副本對象荞下。
1伶选、copy:創(chuàng)建的時不可變副本(如NSString、NSArray尖昏、NSDictionary)考蕾。
2、mutableCopy:創(chuàng)建的可變副本(如NSMutableString会宪、NSMutableArray肖卧、NSMutableDictionary)。
使用copy功能的前提:
1掸鹅、copy:需要遵守NSCopying協(xié)議塞帐,實現(xiàn)copyWithZone:方法。
@protocolNSCopying
- (id)copyWithZone:(NSZone*)zone;
2巍沙、mutableCopy : 需要遵守NSMutableCopying協(xié)議葵姥,實現(xiàn)mutableCopyWithZone:方法
@protocolNSMutableCopying
- (id)mutableCopyWithZone:(NSZone*)zone;
@end
深復制和淺復制的區(qū)別:
深復制(深拷貝、內(nèi)容拷貝句携、deep copy):
特點:1榔幸、源對象和副本對象是不同的兩個對象;
2矮嫉、源對象引用計數(shù)器不變削咆,副本對象計數(shù)器為1(因為是新產(chǎn)生的)。
本質(zhì):產(chǎn)生了新對象蠢笋。
淺復制(淺拷貝拨齐、指針拷貝、shallow copy):
特點:1昨寞、源對象和副本對象是同一對象瞻惋;
2、源對象(副本對象)引用計數(shù)器+1援岩,相當于做一次retain操作歼狼。
本質(zhì):沒有產(chǎn)生新對象。
常見的復制如下圖:
只有源對象和副本對象都不可變時享怀,才是淺復制羽峰,其他都是深復制。
關于區(qū)分深復制與淺復制的一些詳細代碼如下:
/**
NSMutableString調(diào)用mutableCopy?:?深復制
*/voidmutableStringMutableCopy(){NSMutableString*srcStr?=?[NSMutableStringstringWithFormat:@"age?is?%d",10];NSMutableString*copyStr?=?[srcStr?mutableCopy];????????[copyStr?appendString:@"abc"];NSLog(@"srcStr=%@,?copyStr=%@",?srcStr,?copyStr);}/**
NSMutableString調(diào)用copy?:?深復制
*/voidmutableStringCopy(){NSMutableString*srcStr?=?[NSMutableStringstringWithFormat:@"age?is?%d",10];NSString*copyStr?=?[srcStrcopy];????????????[srcStr?appendString:@"abc"];NSLog(@"srcStr=%p,?copyStr=%p",?srcStr,?copyStr);}/**
NSString調(diào)用mutableCopy?:?深復制
*/voidstringMutableCopy(){NSString*srcStr?=?[NSStringstringWithFormat:@"age?is?%d",10];NSMutableString*copyStr?=??[srcStr?mutableCopy];????[copyStr?appendString:@"abc"];NSLog(@"srcStr=%@,?copyStr=%@",?srcStr,?copyStr);}/**
NSString調(diào)用copy?:?淺復制
*/voidstringCopy(){//??copy?:?產(chǎn)生的肯定是不可變副本//??如果是不可變對象調(diào)用copy方法產(chǎn)出不可變副本,那么不會產(chǎn)生新的對象NSString*srcStr?=?[NSStringstringWithFormat:@"age?is?%d",10];NSString*copyStr?=?[srcStrcopy];NSLog(@"%p?%p",?srcStr,?copyStr);}
@property內(nèi)存管理策略的選擇
1.非ARC
1> copy :只用于NSString\block限寞;
2> retain :除NSString\block以外的OC對象忍啸;
3> assign :基本數(shù)據(jù)類型、枚舉履植、結(jié)構體(非OC對象)计雌,當2個對象相互引用,一端用retain玫霎,一端???????? ????????? ? 用assign凿滤。
2.ARC
1> copy :只用于NSString\block;
2> strong :除NSString\block以外的OC對象庶近;
3> weak :當2個對象相互引用翁脆,一端用strong,一端用weak鼻种;
4> assgin :基本數(shù)據(jù)類型反番、枚舉、結(jié)構體(非OC對象)