小編致力于用精簡的語言說明不精簡的問題
一、概念
- 淺復制:拷貝指向對象的指針
- 深復制:拷貝對象到另一塊內存中
二、對象拷貝遵循規(guī)則
無論是集合類型NSArray注竿、NSDictionary辰妙、NSSet ...,還是非集合類型NSString, NSNumber ... 對象仆抵,調用copy跟继、mutableCopy方法時:
- copy永遠返回不可變對象
- mutableCopy永遠返回可變對象
- 對于不可變對象進行copy操作,是指針賦值
- 對于對象(無論可變不可變)進行mutableCopy操作镣丑,都是內容賦值
注:下面代碼是對的舔糖,只是改變了str對象的指針
NSString *str = @"string";
str = @"newString";
三、集合拷貝遵循規(guī)則
3.1.集合的淺復制
- 進行淺復制時莺匠,會向原始的集合發(fā)送retain消息金吗,引用計數(shù)加1,同時指針被拷貝到新的集合
- 淺復制代碼舉例
NSArray *shallowCopyArray = [someArray copyWithZone:nil];
NSSet *shallowCopySet = [NSSet mutableCopyWithZone:nil];
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];
3.2.集合的深復制
方法1:initWithArray:copyItems:
- 集合里的每個對象都會收到 copyWithZone: 消息。如果對象遵循 了NSCopying 協(xié)議摇庙,就會被深復制到新的集合旱物。如果沒有,用這種方法進行深復制卫袒,在運行時就會出錯宵呛。copyWithZone: 方法只能夠提供一層拷貝,而非真正的深拷貝
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
方法2:歸檔之后解擋
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
3.3.集合的單層深復制 (one-level-deep copy)
在多層數(shù)組中夕凝,對第一層進行內容拷貝宝穗,其它層進行指針拷貝
參考資料:
深復制與淺復制解析