iOS 淺拷貝、深拷貝和完全深拷貝 問題

1.前言問題

在開發(fā)中,總是碰到拷貝問題,不過網(wǎng)上能夠把所有的情況都總結(jié)完成的非常少舀武。今天我就總結(jié)下我遇到過的IOS開發(fā)中的拷貝問題拄养。希望能給大家把這個(gè)問題講明白。

2.幾個(gè)拷貝的概念

1)淺拷貝: 淺拷貝就是拷貝指向原來對(duì)象的指針奕剃,使原對(duì)象的引用計(jì)數(shù)+1衷旅,可以理解為創(chuàng)建了一個(gè)指向原對(duì)象的新指針而已,并沒有創(chuàng)建一個(gè)全新的對(duì)象纵朋。
2)深拷貝:指拷貝對(duì)象的具體內(nèi)容柿顶,而內(nèi)存地址是自主分配的,拷貝結(jié)束之后操软,兩個(gè)對(duì)象雖然存的值是相同的嘁锯,但是內(nèi)存地址不一樣,兩個(gè)對(duì)象也互不影響聂薪,互不干涉家乘。(至少有一層是深拷貝)
3)完全深拷貝:在做深拷貝的時(shí)候,我們拷貝的對(duì)象具有多層,每一層我們都需要拷貝對(duì)象,而不是簡(jiǎn)單的指針拷貝。

3.詳解淺拷貝深拷貝

在這方面很多人已經(jīng)總結(jié)過一般對(duì)象的深淺拷貝問題了,在單一對(duì)象進(jìn)行深淺拷貝的問題,有幾個(gè)總結(jié)的比較好的文章:
(詳解iOS的深淺拷貝)[http://www.reibang.com/p/afca814fba36]
(iOS開發(fā) 深拷貝與淺拷貝)[http://www.reibang.com/p/f01d490401f9]
大致上就是探究了一下深淺拷貝的含義,與IOS 一般開發(fā)中如何深淺拷貝

4.完全拷貝

要想對(duì)多層集合對(duì)象進(jìn)行拷貝藏澳,我們需要進(jìn)行完全拷貝仁锯,這里可以使用歸檔和接檔。

NSArray * array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],[NSString stringWithString:@"b"],@"c",nil];
NSArray * deepCopyArray=[[NSArray alloc] initWithArray: array copyItems: YES];
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: array]];

控制器截圖:


image.png

1.trueDeepCopyArray是完全意義上的深拷貝翔悠,而deepCopyArray則不是业崖,對(duì)于deepCopyArray內(nèi)的元素還是淺拷貝
2.[deepCopyArray objectAtIndex:0]因?yàn)樵瓉硎强勺儗?duì)象,還和上面的結(jié)論一樣蓄愁,依舊是深拷貝双炕。
3.用歸檔的方法實(shí)現(xiàn)了真正的元素深拷貝。

當(dāng)對(duì)象中含有自定義對(duì)象時(shí)我們需要對(duì)該類實(shí)現(xiàn)

  • (void)encodeWithCoder:(NSCoder *)aCoder和- (id)initWithCoder:(NSCoder *)aDecoder兩個(gè)方法,否則會(huì)crash.
    例 person類:
- (void) encodeWithCoder: (NSCoder *)coder
{
        [coder encodeObject:self.userName forKey:@"userName"];
        [coder encodeObject:self.userReview forKey:@"userReview"];
        [coder encodeObject:self.userTime forKey:@"userTime"];
        [coder encodeFloat:self.userStarNum forKey:@"userStarNum"];
}
 
- (id) initWithCoder: (NSCoder *) coder
{       
        userName = [[coder decodeObjectForKey:@"userName"]copy];
        userReview = [[coder decodeObjectForKey:@"userReview"]copy];
        userTime = [[coder decodeObjectForKey:@"userTime"]copy];
        userStarNum = [coder decodeFloatForKey:@"userStarNum"];
        return self;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撮抓,一起剝皮案震驚了整個(gè)濱河市妇斤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖站超,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荸恕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顷编,警方通過查閱死者的電腦和手機(jī)戚炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門剑刑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳纬,“玉大人,你說我怎么就攤上這事施掏∨セ荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵七芭,是天一觀的道長(zhǎng)素挽。 經(jīng)常有香客問我,道長(zhǎng)狸驳,這世上最難降的妖魔是什么预明? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮耙箍,結(jié)果婚禮上撰糠,老公的妹妹穿的比我還像新娘。我一直安慰自己辩昆,他們只是感情好阅酪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汁针,像睡著了一般术辐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上施无,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天辉词,我揣著相機(jī)與錄音,去河邊找鬼猾骡。 笑死瑞躺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卓练。 我是一名探鬼主播隘蝎,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼襟企!你這毒婦竟也來了嘱么?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤顽悼,失蹤者是張志新(化名)和其女友劉穎曼振,沒想到半個(gè)月后几迄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冰评,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年映胁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲雅。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡解孙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抛人,到底是詐尸還是另有隱情弛姜,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布妖枚,位于F島的核電站廷臼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绝页。R本人自食惡果不足惜荠商,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续誉。 院中可真熱鬧莱没,春花似錦、人聲如沸屈芜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽井佑。三九已至属铁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躬翁,已是汗流浹背焦蘑。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒发,地道東北人例嘱。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宁舰,于是被迫代替她去往敵國(guó)和親拼卵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355