Objective-C中淺復(fù)制砂竖,深復(fù)制和歸檔那些事

淺復(fù)制和深復(fù)制

? ? ? ?關(guān)于淺復(fù)制和深復(fù)制真椿,之前一直都沒有系統(tǒng)的理一遍,今天就來做做總結(jié)歸納乎澄。什么是淺復(fù)制,什么是深復(fù)制测摔,我覺得用一句簡單的話來說淺復(fù)制就是指針復(fù)制置济,深復(fù)制就是內(nèi)容復(fù)制。

? ? 我們先來看一個例子:

示例

? ? ? ? 由示例程序可以看出锋八,不可變字符串只有在使用mutableCopy時才進行的深復(fù)制浙于,使用copy時進行的淺復(fù)制,而可變字符串不管使用copy還是mutableCopy都是深復(fù)制挟纱。其實這個規(guī)律不止對NSString 適用羞酗,對系統(tǒng)的一些其他對象同樣適用,下面我展示了一張簡易的對照表:

對照表

? ? ? ? 上面說的都是系統(tǒng)類紊服,那如果使我們自定義類又會是怎么樣呢檀轨?請看下面的例子:

示例

? ? ? 首先聲明一下為什么要實現(xiàn)上述的copyWithZone和mutableCopyWithZone方法胸竞?其實在iOS中并不是所有的對象都支持copy、mutableCopy方法参萄,只有遵守NSCopying協(xié)議的類可以發(fā)送copy消息卫枝,遵守NSMutableCopying協(xié)議的類才可以發(fā)送mutableCopy消息,否則就會崩潰讹挎。所以當我們想對自定義的類實現(xiàn)復(fù)制時校赤,就需要遵守這些協(xié)議寫上這些方法。在上例中兩種方式都是深復(fù)制筒溃,原因也很簡單马篮,因為它們都創(chuàng)建了新的對象。

? ? ? ? 到這里了我們不妨再想想怜奖,那既然自定義的對象是深復(fù)制积蔚,那對象的屬性呢,是深復(fù)制還是淺復(fù)制烦周?

示例

? ? ? ? 由示例程序可以看到尽爆,Address類的street屬性打印為456,表明他是深復(fù)制读慎,其實要想明白這個問題很簡單漱贱,他的關(guān)鍵在于這里我street的屬性修飾符是copy,相當于對可變字符串street進行了深復(fù)制夭委,生成了一個新的對象幅狮,然后賦值給了Address類的屬性。如果這里換成strong株灸,結(jié)果就會為456789崇摄,因為strong會持有原來的對象,是淺復(fù)制慌烧。

? ? ? ? 事情到這里了好像一切明朗起來了逐抑,但是還有一個問題,請看下面這個例子:

示例

? ? ? ? 這個例子中屹蚊,dataArray和dataArray2是進行了深復(fù)制厕氨,由最后打印的內(nèi)存地址可以看出,但是為什么改變了dataArray2的元素dataArray中的元素也跟著變了呢汹粤?當我們在用mutableCopy方法復(fù)制元素時命斧,在內(nèi)存中為新的數(shù)組分配了空間,并且將單個元素復(fù)制到新數(shù)組中嘱兼。然而將原始數(shù)組中的每一個元素復(fù)制到新位置意味著:緊將一個數(shù)組元素復(fù)制到另一個數(shù)組元素国葬。這樣做的最終結(jié)果,就是這兩個數(shù)組中的元素都指向內(nèi)存中的同一個字符串。那么我們到底要怎么樣才能為數(shù)組中的每一個元素創(chuàng)建完全不同的副本汇四,而不僅是職責(zé)一些對象的引用副本呢接奈,這就需要用到我們接下來要介紹的歸檔技術(shù)。

歸檔

? ? ? ? 在Objective-C中船殉,歸檔是一個過程鲫趁,即用某種格式來保存一個或多個對象,以便以后還原這些對象利虫。下面我們來介紹一下歸檔的集中方法挨厚。

使用XML屬性列表進行歸檔

如果你的對象是NSString,NSDictionary,NSArray,NSData,NSNumber類型,你可以使用這些類中實現(xiàn)的writeToFile:atomically:方法將數(shù)據(jù)寫到文件中糠惫,在寫出某個字典或數(shù)組的情況下疫剃,該方法可以使用XML屬性列表的格式寫出數(shù)據(jù)。下面是示例程序:

示例

? ? ? ?atomically參數(shù)設(shè)置為yes硼讽,表示希望首先將字典寫入臨時備份文件中巢价,并且一旦成功,將把最終數(shù)據(jù)轉(zhuǎn)移到名為test的指定文件中固阁,這是一種安全措施壤躲,它保護文件在一些情況下(如系統(tǒng)在執(zhí)行操作過程中崩潰時)免受破壞。

使用NSKeyedArchiver歸檔

? ? ?若要將各種類型的對象存儲到文件中备燃,而且不僅僅是字符串碉克,數(shù)組和字典類型,有一種更靈活的辦法并齐,就是利用NSKeyedArchiver類創(chuàng)建帶鍵的檔案來完成漏麦。

1.基本的Objective-C歸檔

示例

2.歸檔自定義類型

? ? ? ?要歸檔自定義的類型,我們必須告訴系統(tǒng)要如何歸檔我們的對象况褪,以及如何解歸檔它們撕贞。這就要求我們必須實現(xiàn)NSCoding協(xié)議,在類中添加encodeWithCoder:方法和initWithCoder:方法實現(xiàn)测垛。下面是示例程序:

示例

使用NSData創(chuàng)建自定義檔案

? ? 有時候可能不想和前面一樣捏膨,可能想收集一些或所有的對象,并將其存儲到單個檔案文件中赐纱,在Objective-C中脊奋,通過使用名為NSData的通用數(shù)據(jù)流對象類,可以實現(xiàn)上述功能疙描。示例程序如下:

示例

使用歸檔程序深復(fù)制對象

? ? ? ? 最后一點內(nèi)容,我們來介紹一下如何使用歸檔來實現(xiàn)前面遺留的深復(fù)制問題讶隐。示例代碼如下:

示例

? ? ? ? 這個輸出結(jié)果驗證了更改了dataArray2但并沒有影響dataArray的元素起胰,實現(xiàn)了數(shù)組的深復(fù)制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市效五,隨后出現(xiàn)的幾起案子地消,更是在濱河造成了極大的恐慌,老刑警劉巖畏妖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉执,死亡現(xiàn)場離奇詭異,居然都是意外死亡戒劫,警方通過查閱死者的電腦和手機半夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迅细,“玉大人巫橄,你說我怎么就攤上這事∫鸬洌” “怎么了湘换?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長统阿。 經(jīng)常有香客問我彩倚,道長,這世上最難降的妖魔是什么扶平? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任帆离,我火速辦了婚禮,結(jié)果婚禮上蜻直,老公的妹妹穿的比我還像新娘盯质。我一直安慰自己,他們只是感情好概而,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布呼巷。 她就那樣靜靜地躺著,像睡著了一般赎瑰。 火紅的嫁衣襯著肌膚如雪王悍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天餐曼,我揣著相機與錄音压储,去河邊找鬼。 笑死源譬,一個胖子當著我的面吹牛集惋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踩娘,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼刮刑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雷绢,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤泛烙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翘紊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔽氨,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年帆疟,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹉究。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸯匹,死狀恐怖坊饶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殴蓬,我是刑警寧澤匿级,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站染厅,受9級特大地震影響痘绎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肖粮,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一孤页、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涩馆,春花似錦行施、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涯雅,卻和暖如春鲜结,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背活逆。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工精刷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔗候。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓怒允,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锈遥。 傳聞我的和親對象是個殘疾皇子误算,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. 屬性中copy與strong特性的區(qū)別 在開始學(xué)習(xí)淺復(fù)制(Shallow Copy)、深復(fù)制(Deep Co...
    pro648閱讀 1,699評論 2 16
  • 1懦尝、對象拷貝有兩種方式:淺復(fù)制和深復(fù)制知纷。顧名思義,淺復(fù)制陵霉,并不拷貝對象本身琅轧,僅僅是拷貝指向?qū)ο蟮闹羔槪簧顝?fù)制是直接...
    滴答大閱讀 759評論 0 2
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 858評論 0 2
  • 前言 不敢說覆蓋OC中所有copy的知識點踊挠,但最起碼是目前最全的最新的一篇關(guān)于 copy的技術(shù)文檔了乍桂。后續(xù)發(fā)現(xiàn)有新...
    zyydeveloper閱讀 3,334評論 4 35
  • iOS 集合的深復(fù)制與淺復(fù)制 概念 對象拷貝有兩種方式:淺復(fù)制和深復(fù)制。顧名思義效床,淺復(fù)制睹酌,并不拷貝對象本身,僅僅是...
    難卻卻閱讀 317評論 0 1