iOS 單層深復制與完全深復制

概念

  • 淺復制就是兩個變量指向了同一塊內存區(qū)域祟昭;
  • 深復制就是兩個變量指向了不同的內存區(qū)域排苍。
淺復制示意圖
深復制示意圖
  • 非集合對象:如NSString,NSInteger,NSNumber……
  • 集合對象:如NSArray,NSDictionary幽勒,……

結論

1、非集合對象的copy與mutableCopy

  • 可變對象的copy和mutableCopy方法都是深復制役纹;
  • 不可變對象的copy方法是淺復制蟀瞧,mutableCopy方法是深復制;
  • 無論是可變對象還是不可變對象届氢,copy方法返回的對象是不可變對象欠窒。

2、集合對象的copy與mutableCopy

集合對象與非集合對象所遵循的規(guī)則基本上是一樣的退子,唯一差別:
集合對象的深復制并不是嚴格意義上的深復制岖妄,而是單層深復制。

單層深復制:對集合對象來說寂祥,深復制時只是將第一層對象進行了深復制荐虐,內部的對象仍然是淺復制。

3丸凭、集合對象的完全復制

  • 方法一:使用 initWith***: copyItems:YES 方法
    自定義集合對象使用這個方法福扬,對象必須遵守NSCopying協(xié)議,并重寫- (id)copyWithZone:(NSZone *)zone方法惜犀。(系統(tǒng)類方法已經(jīng)實現(xiàn))铛碑。

代碼及運行結果如下:

#import <Foundation/Foundation.h>

@interface ModelStudent : NSObject<NSCopying>

@property(nonatomic, copy) NSString * name;

@property(nonatomic, assign) NSInteger  age;

@property(nonatomic, assign) NSInteger sex;

@end
#import "ModelStudent.h"

@implementation ModelStudent

- (id)copyWithZone:(NSZone *)zone{
    ModelStudent * s = [[ModelStudent alloc]init];
    s.name = self.name;
    s.age = self.age;
    s.sex = self.sex;
    return s;
}

@end
    ModelStudent * model1 = [ModelStudent new];
    model1.name = @"mao";
    model1.age = 14;

    ModelStudent * model2 = [ModelStudent new];
    model2.name = @"mao";
    model2.age = 14;
    
    self.arr = @[model1, model2];
    
    //完全深復制
    NSArray * array4 = [[NSArray alloc]initWithArray:self.arr copyItems:YES];
    NSLog(@"%@,%@", self.arr, array4);
運行結果
  • 方法二:先將集合進行歸檔,然后再解檔虽界。
    通常我們對模型數(shù)組完全復制汽烦,先將模型數(shù)組轉換為data數(shù)組,再將data數(shù)組轉換為模型數(shù)組莉御,即可刹缝。代碼如下:
#import <Foundation/Foundation.h>

@interface ModelStudent : NSObject<NSCoding>

@property(nonatomic, copy) NSString * name;

@property(nonatomic, assign) NSInteger  age;

@property(nonatomic, assign) NSInteger sex;

@end
#import "ModelStudent.h"

@implementation ModelStudent

- (void)encodeWithCoder:(NSCoder *)aCoder{

    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:@(self.age) forKey:@"age"];
    [aCoder encodeObject:@(self.sex) forKey:@"sex"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];
        self.sex = [[aDecoder decodeObjectForKey:@"sex"] integerValue];
    }
    return self;
}

@end
ModelStudent * model1 = [ModelStudent new];
    model1.name = @"mao";
    model1.age = 14;
    
    ModelStudent * model2 = [ModelStudent new];
    model2.name = @"mao";
    model2.age = 14;
    
    self.arr = @[model1, model2];
    
    NSMutableArray * arr2 = [self.arr mutableCopy];
    //完全深復制
    //先歸檔
    NSMutableArray * mDatas = [NSMutableArray arrayWithCapacity:0];
    for (ModelStudent * model in self.arr) {
        NSData * data = [NSKeyedArchiver archivedDataWithRootObject:model];
        [mDatas addObject:data];
    }
    //再解檔
    NSMutableArray * mModels = [NSMutableArray arrayWithCapacity:0];
    for (NSData * data in mDatas) {
        ModelStudent * model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        [mModels addObject:model];
    }
    
    NSLog(@"非完全深復制:%@---%@", self.arr, arr2);
    NSLog(@"完全深復制:%@---%@", self.arr, mModels);
打印結果

參考

iOS中的深復制與淺復制
NSObject 有個copyWithZone是什么作用?
iOS學習筆記系列 - OC如何正確重寫copyWithZone

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末颈将,一起剝皮案震驚了整個濱河市梢夯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晴圾,老刑警劉巖颂砸,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異死姚,居然都是意外死亡人乓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門都毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來色罚,“玉大人,你說我怎么就攤上這事账劲〈粱ぃ” “怎么了金抡?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腌且。 經(jīng)常有香客問我梗肝,道長,這世上最難降的妖魔是什么铺董? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任巫击,我火速辦了婚禮,結果婚禮上精续,老公的妹妹穿的比我還像新娘坝锰。我一直安慰自己,他們只是感情好重付,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布什黑。 她就那樣靜靜地躺著,像睡著了一般堪夭。 火紅的嫁衣襯著肌膚如雪愕把。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天森爽,我揣著相機與錄音恨豁,去河邊找鬼。 笑死爬迟,一個胖子當著我的面吹牛橘蜜,可吹牛的內容都是我干的。 我是一名探鬼主播付呕,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼计福,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徽职?” 一聲冷哼從身側響起象颖,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姆钉,沒想到半個月后说订,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡潮瓶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年陶冷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毯辅。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡埂伦,死狀恐怖,靈堂內的尸體忽然破棺而出思恐,到底是詐尸還是另有隱情沾谜,我是刑警寧澤膊毁,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站类早,受9級特大地震影響媚媒,放射性物質發(fā)生泄漏嗜逻。R本人自食惡果不足惜涩僻,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栈顷。 院中可真熱鬧逆日,春花似錦、人聲如沸萄凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靡努。三九已至坪圾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惑朦,已是汗流浹背兽泄。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漾月,地道東北人病梢。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像梁肿,于是被迫代替她去往敵國和親蜓陌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • 原文:淺析iOS的淺復制與深復制 最近同事問我一個問題:原數(shù)組A吩蔑,進行復制得到數(shù)組B钮热,改變數(shù)組B的Person元素...
    Daisuke閱讀 473評論 0 2
  • 1、對象拷貝有兩種方式:淺復制和深復制烛芬。顧名思義霉旗,淺復制,并不拷貝對象本身蛀骇,僅僅是拷貝指向對象的指針厌秒;深復制是直接...
    滴答大閱讀 772評論 0 2
  • 1. 屬性中copy與strong特性的區(qū)別 在開始學習淺復制(Shallow Copy)辟灰、深復制(Deep Co...
    pro648閱讀 1,721評論 2 16
  • iOS 集合的深復制與淺復制 概念 對象拷貝有兩種方式:淺復制和深復制。顧名思義篡石,淺復制芥喇,并不拷貝對象本身,僅僅是...
    難卻卻閱讀 319評論 0 1
  • NSObject類提供了copy和mutableCopy方法凰萨,通過這兩個方法即可復制已有對象的副本继控,本文將會詳細介...
    Davis_閱讀 3,306評論 0 4