NSString NSArray的copy和mutableCopy

淺復(fù)制——即指針復(fù)制醇锚,不創(chuàng)建新的對(duì)象芦劣;
深復(fù)制——即內(nèi)容復(fù)制,創(chuàng)建一個(gè)新的對(duì)象丁寄。
(這么精辟的話當(dāng)然出自高手之口)
引自:http://www.reibang.com/p/ebbac2fec4c6

1 NSString和NSMutableString

(1) NSString發(fā)送copy消息時(shí)會(huì)進(jìn)行淺復(fù)制:

NSString *name = @"name";
NSString *nameFromCopy = [name copy];
NSLog(@"%p", name);
NSLog(@"%p", nameFromCopy);
[2283:101871] 0x1000020b0
[2283:101871] 0x1000020b0

看上去對(duì)NSString的copy好像什么都沒做柑营,實(shí)際上是有的屈雄,ARC會(huì)在后臺(tái)調(diào)用retain給這個(gè)字符串添加一個(gè)引用計(jì)數(shù)。

(2)NSString發(fā)送mutableCopy消息是深復(fù)制:

NSString *name = @"name";
NSString *nameFromCopy = [name mutableCopy];
NSLog(@"%p", name);
NSLog(@"%p", nameFromCopy);
[2743:131031] 0x1000020b0
[2743:131031] 0x100700200

(3) 向NSMutableString發(fā)送copy消息會(huì)進(jìn)行深復(fù)制:

NSMutableString *name = [[NSMutableString alloc] initWithString:@"name"];
NSString *nameFromCopy = [name copy];
NSLog(@"%p", name);
NSLog(@"%p", nameFromCopy);
[2270:97375] 0x100100540
[2270:97375] 0x656d616e45

(4) NSMutableString的mutableCopy消息是深復(fù)制:

NSMutableString *name = [[NSMutableString alloc] initWithString:@"name"];
NSString *nameFromCopy = [name mutableCopy];
NSLog(@"%p", name);
NSLog(@"%p", nameFromCopy);

[2753:133279] 0x1005034d0
[2753:133279] 0x100503650

小結(jié):

Numbers制表

2 NSArray和NSMutableArray

(1) NSArray的copy是淺復(fù)制

NSArray *array = [[NSArray alloc] init];
NSArray *arrayFromCopy = [array copy];
NSLog(@"%p", array);
NSLog(@"%p", arrayFromCopy);
[2798:141184] 0x100501360
[2798:141184] 0x100501360

(2)NSMutable的copy是深復(fù)制

NSMutableArray *array = [[NSMutableArray alloc] init];
NSArray *arrayFromCopy = [array copy];
NSLog(@"%p", array);
NSLog(@"%p", arrayFromCopy);
[2871:152574] 0x100700420
[2871:152574] 0x100501360

(3)NSArray的mutableCopy是深復(fù)制

NSArray *array = [[NSArray alloc] init];
NSArray *arrayFromCopy = [array mutableCopy];
NSLog(@"%p", array);
NSLog(@"%p", arrayFromCopy);
[2881:155075] 0x100201360
[2881:155075] 0x100700a90

(4)NSMutableArray的mutableCopy是深復(fù)制

NSMutableArray *array = [[NSMutableArray alloc] init];
NSArray *arrayFromCopy = [array mutableCopy];
NSLog(@"%p", array);
NSLog(@"%p", arrayFromCopy);
[2891:156290] 0x1007001e0
[2891:156290] 0x100700380

也就是說官套,得出了跟NSString和NSMutableString之間一樣的結(jié)論酒奶??

Numbers制表

表面上來看奶赔,確實(shí)是這樣惋嚎。但是,數(shù)組作為一個(gè)容器站刑,肯定還要考慮里面的數(shù)據(jù)情況另伍。我們嘗試在數(shù)組里放點(diǎn)實(shí)驗(yàn)數(shù)據(jù),比如幾個(gè)字符串:
NSArray的copy:

//創(chuàng)建3個(gè)可變字符串
NSMutableString *string1 = [NSMutableString stringWithFormat:@"a"];
NSMutableString *string2 = [NSMutableString stringWithFormat:@"b"];
NSMutableString *string3 = [NSMutableString stringWithFormat:@"c"];
//將3個(gè)字符串放入數(shù)組中
NSArray *array = [NSArray arrayWithObjects:string1, string2, string3, nil];
NSArray *arrayFromCopy = [array copy];
NSLog(@"%p", array);                //輸出原數(shù)組及其元素的地址
NSLog(@"%p", array[0]);
NSLog(@"%p", array[1]);
NSLog(@"%p", array[2]);
printf("\n");
NSLog(@"%p", arrayFromCopy);        //輸出copy的數(shù)組及其元素的地址
NSLog(@"%p", arrayFromCopy[0]);
NSLog(@"%p", arrayFromCopy[1]);
NSLog(@"%p", arrayFromCopy[2]);
[3141:182137] 0x100701030
[3141:182137] 0x100700200
[3141:182137] 0x1007003e0
[3141:182137] 0x100700440

[3141:182137] 0x100701030
[3141:182137] 0x100700200
[3141:182137] 0x1007003e0
[3141:182137] 0x100700440

NSArray的mutableCopy

NSArray *array = [NSArray arrayWithObjects:string1, string2, string3, nil];
NSArray *arrayFromCopy = [array mutableCopy];
NSLog(@"%p", array);          //輸出原數(shù)組及其元素的地址
NSLog(@"%p", array[0]);
NSLog(@"%p", array[1]);
NSLog(@"%p", array[2]);
printf("\n");
NSLog(@"%p", arrayFromCopy);        //輸出copy的數(shù)組及其元素的地址
NSLog(@"%p", arrayFromCopy[0]);
NSLog(@"%p", arrayFromCopy[1]);
NSLog(@"%p", arrayFromCopy[2]);
[3151:184027] 0x100103410
[3151:184027] 0x1001024d0
[3151:184027] 0x100102390
[3151:184027] 0x1001023d0

[3151:184027] 0x100102bf0
[3151:184027] 0x1001024d0
[3151:184027] 0x100102390
[3151:184027] 0x1001023d0

所以绞旅,其實(shí)NSArray的mutableCopy只是對(duì)數(shù)組對(duì)象進(jìn)行了深復(fù)制摆尝,而數(shù)組內(nèi)元素依然是淺復(fù)制。像下圖這樣:

Numbers繪圖

事實(shí)上NSMutableArray的copy和mutableCopy也是這樣因悲,為了節(jié)省篇幅我就不放代碼了堕汞,有興趣的朋友可以自己試一下。

如果想實(shí)現(xiàn)數(shù)組內(nèi)元素也進(jìn)行深復(fù)制晃琳,有個(gè)比較簡(jiǎn)單的方法讯检,就是用NSArray提供的一個(gè)初始化方法
-(instancetype)initWithArray:copyItems:

NSArray *array = [NSArray arrayWithObjects:string1, string2, string3, nil];
NSArray *arrayFromCopy = [[NSArray alloc] initWithArray:array copyItems:YES];
NSLog(@"%p", array);               //輸出原數(shù)組及其元素的地址
NSLog(@"%p", array[0]);
NSLog(@"%p", array[1]);
NSLog(@"%p", array[2]);
printf("\n");
NSLog(@"%p", arrayFromCopy);        //輸出copy的數(shù)組及其元素的地址
NSLog(@"%p", arrayFromCopy[0]);
NSLog(@"%p", arrayFromCopy[1]);
NSLog(@"%p", arrayFromCopy[2]);
[3166:189328] 0x100106fc0
[3166:189328] 0x100100270
[3166:189328] 0x100105eb0
[3166:189328] 0x100105f10

[3166:189328] 0x100106d90
[3166:189328] 0x6115
[3166:189328] 0x6215
[3166:189328] 0x6315

現(xiàn)在引用情況像這樣:


Numbers繪圖

我猜你現(xiàn)在肯定很想知道琐鲁,下面這種情況的話,用上面的深復(fù)制方法能否奏效:(模仿歪果仁的口吻人灼,聽起來就像是一個(gè)很牛逼的人在說話一樣)

Numbers繪圖
//創(chuàng)建3個(gè)可變字符串
NSMutableString *string1 = [NSMutableString stringWithFormat:@"a"];
NSMutableString *string2 = [NSMutableString stringWithFormat:@"b"];
NSMutableString *string3 = [NSMutableString stringWithFormat:@"c"];
       
//將string1放入數(shù)組array_0中
NSArray *array_0 = [[NSArray alloc] initWithObjects:string1, nil];
//將array_0围段,string2,string3放入數(shù)組array中
NSArray *array = [NSArray arrayWithObjects:array_0, string2, string3, nil];
//復(fù)制?數(shù)組
NSArray *arrayFromCopy = [[NSArray alloc] initWithArray:array copyItems:YES];
//輸出
NSLog(@"%p", array);          //輸出原數(shù)組及其元素的地址
NSLog(@"%p", array[0]);
NSLog(@"%p", array[1]);
NSLog(@"%p", array[2]);
printf("\n");
NSLog(@"%p", arrayFromCopy);    //輸出copy的數(shù)組及其元素的地址
NSLog(@"%p", arrayFromCopy[0]);
NSLog(@"%p", arrayFromCopy[1]);
NSLog(@"%p", arrayFromCopy[2]);
printf("\n");
NSLog(@"%p", array[0][0]);   //輸出原數(shù)組和copy數(shù)組的數(shù)組的字符串string1地址
NSLog(@"%p", arrayFromCopy[0][0]);
[3203:205170] 0x100106ef0
[3203:205170] 0x1001069b0
[3203:205170] 0x100100200
[3203:205170] 0x100100260

[3203:205170] 0x100106f20
[3203:205170] 0x1001069b0
[3203:205170] 0x6215
[3203:205170] 0x6315

[3203:205170] 0x1001062f0
[3203:205170] 0x1001062f0

這就是答案:


Numbers繪圖

可見NSArray的實(shí)例方法-(instancetype)initWithArray:copyItems:的深復(fù)制到三維數(shù)組已經(jīng)力不從心了投放,如果想對(duì)三維或以上的數(shù)組進(jìn)行徹底深復(fù)制奈泪,就必須使用殺手锏——?dú)w檔。
關(guān)于歸檔跪呈,筆者另文:http://www.reibang.com/p/a0b994d34c0a

這2篇文章循環(huán)引用了:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末段磨,一起剝皮案震驚了整個(gè)濱河市取逾,隨后出現(xiàn)的幾起案子耗绿,更是在濱河造成了極大的恐慌,老刑警劉巖砾隅,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误阻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晴埂,警方通過查閱死者的電腦和手機(jī)究反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儒洛,“玉大人精耐,你說我怎么就攤上這事±哦停” “怎么了卦停?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恼蓬。 經(jīng)常有香客問我惊完,道長(zhǎng),這世上最難降的妖魔是什么处硬? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任小槐,我火速辦了婚禮,結(jié)果婚禮上荷辕,老公的妹妹穿的比我還像新娘凿跳。我一直安慰自己,他們只是感情好疮方,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布控嗜。 她就那樣靜靜地躺著,像睡著了一般案站。 火紅的嫁衣襯著肌膚如雪躬审。 梳的紋絲不亂的頭發(fā)上棘街,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音承边,去河邊找鬼遭殉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛博助,可吹牛的內(nèi)容都是我干的险污。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼富岳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛔糯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窖式,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蚁飒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后萝喘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淮逻,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年阁簸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爬早。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡启妹,死狀恐怖筛严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饶米,我是刑警寧澤桨啃,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站咙崎,受9級(jí)特大地震影響优幸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褪猛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一网杆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伊滋,春花似錦碳却、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筒主,卻和暖如春关噪,著一層夾襖步出監(jiān)牢的瞬間鸟蟹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工使兔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留建钥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓虐沥,卻偏偏與公主長(zhǎng)得像熊经,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欲险,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 868評(píng)論 0 2
  • 為什么很多內(nèi)置類如UITableView的delegate屬性都是assign而不是retain? 所有的引用計(jì)數(shù)...
    煙雨平生花飛舞閱讀 1,190評(píng)論 0 3
  • 前言 不敢說覆蓋OC中所有copy的知識(shí)點(diǎn)镐依,但最起碼是目前最全的最新的一篇關(guān)于 copy的技術(shù)文檔了。后續(xù)發(fā)現(xiàn)有新...
    zyydeveloper閱讀 3,353評(píng)論 4 35
  • 1天试、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制槐壳。顧名思義,淺復(fù)制秋秤,并不拷貝對(duì)象本身宏粤,僅僅是拷貝指向?qū)ο蟮闹羔槪簧顝?fù)制是直接...
    滴答大閱讀 761評(píng)論 0 2
  • D7阿爾法號(hào)阿基米德艙110-黃丹 今天的導(dǎo)讀船長(zhǎng)提到了魚灼卢、漁、道三者之間的意義和關(guān)系来农,讓我想起了這句名言:師者鞋真,...
    Michelle沐晨閱讀 257評(píng)論 0 0