oc 淺拷貝與深拷貝

1. 先說結(jié)論:

分可變對象恳不、不可變對象师痕、自定義對象、容器對象幾種:

對象類型 copy mutableCopy
不可變對象 淺拷貝 深拷貝
可變對象 深拷貝 深拷貝
自定義對象 深拷貝 深拷貝
容器對象 淺拷貝 深拷貝

例子參考: iOS開發(fā)——深拷貝與淺拷貝詳解
注解:

  1. 所有mutableCopy都是深拷貝拌阴,所以只需要記住不可變對象和容器對象(其實就是不可變對象)是淺拷貝就行了
  2. 另外要注意得到對象的類型湿刽,有一種最特殊的烁,就是可變對象copy之后得到的是個不可變對象,所以一個NSMutableString類型的property诈闺,一般應(yīng)該用strong關(guān)鍵字
  3. 容器對象的深拷貝只是對象本身深拷貝渴庆,其元素依然是淺拷貝,如NSMuatableArray *array1雅镊,對其調(diào)用copy或者mutableCopy襟雷,都是生成一個新的對象,但里邊元素的地址是不變的仁烹,如下邊示例2
示例1:可變對象copy的例子
    NSMutableString *mutString = [NSMutableString stringWithString:@"abc"];
    NSMutableString *copyString = [mutString copy];
    NSMutableString *mutableCopyString = [mutString mutableCopy];
    NSLog(@"mutString:%p,copyString:%p,mutableCopyString:%p",mutString,copyString,mutableCopyString);
    [copyString appendString:@"aaaa"];  //此處會引發(fā)崩潰

2018-03-21 15:03:55.706167+0800 iOSLearnigDemo[89468:8764272] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString appendString:]: unrecognized selector sent to instance 0xa000000006362613'

示例2:容器對象copy的例子
    // 容器對象
    NSArray *array = [NSArray arrayWithObject:@(1)];
    NSArray *copyArray = [array copy];
    NSMutableArray *mutableCopyArray = [array mutableCopy];
    NSLog(@"array:%p,copyArray:%p,mutableCopyArray:%p",array,copyArray,mutableCopyArray);
    // 可變?nèi)萜鲗ο?    NSMutableArray *mutableArray = [NSMutableArray arrayWithObject:@(2)];
    NSArray *copyMutableArray = [mutableArray copy];
    NSArray *mutableCopyMutableArray = [mutableArray mutableCopy];
    NSLog(@"mutableArray:%p,copyMutableArray:%p,mutableCopyMutableArray:%p",mutableArray,copyMutableArray,mutableCopyMutableArray);
    // 打印新array中元素的地址耸弄,由下圖可見元素地址都是相同的,所以深拷貝只拷貝對象本身卓缰,其元素依然是淺拷貝
    NSLog(@"mutableArray obj:%p,copyMutableArray obj:%p,mutableCopyMutableArray obj:%p",mutableArray.firstObject,copyMutableArray.firstObject,mutableCopyMutableArray.firstObject);
    

2018-03-21 15:07:27.414277+0800 iOSLearnigDemo[89534:8778488] array:0x600000015870,copyArray:0x600000015870,mutableCopyArray:0x60000024b340
2018-03-21 15:07:27.415237+0800 iOSLearnigDemo[89534:8778488] mutableArray:0x60000024ee80,copyMutableArray:0x6000000158e0,mutableCopyMutableArray:0x600000252cf0
2018-03-21 15:07:27.416033+0800 iOSLearnigDemo[89534:8778488] mutableArray obj:0xb000000000000022,copyMutableArray obj:0xb000000000000022,mutableCopyMutableArray obj:0xb000000000000022

2. 自定義對象

要支持copy與mutableCopy计呈,需要實現(xiàn)NSCopying,NSMutableCopying協(xié)議,用法如下:
(Foundation框架對象都實現(xiàn)了該協(xié)議征唬,所以可以直接使用copy與mutableCopy捌显,UIKit框架不可以)

@interface Person()<NSCopying,NSMutableCopying>
@end
@implementation Person

- (id)copyWithZone:(NSZone *)zone{
    Person *person = [Person allocWithZone:zone];
    person.name = self.name;
    person.year = self.year;
    return person;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    Person *person = [Person allocWithZone:zone];
    person.name = self.name;
    person.year = self.year;
    return person;
}
@end 
   // 簡單的調(diào)用代碼
    Person *person = [[Person alloc] init];
    person.name = @"luofuzhong";
    person.year = 26;
    Person *copyPerson = [person copy];
    Person *mutableCopyPerson = [person mutableCopy];
    NSLog(@"person:%p,copyPerson:%p,mutableCopyPerson:%p",person,copyPerson,mutableCopyPerson);

輸出結(jié)果如下:

2018-03-21 14:42:04.214203+0800 iOSLearnigDemo[89280:8704219] person:0x60000023df20,copyPerson:0x60000023edc0,mutableCopyPerson:0x60000023f820

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市总寒,隨后出現(xiàn)的幾起案子扶歪,更是在濱河造成了極大的恐慌,老刑警劉巖摄闸,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件善镰,死亡現(xiàn)場離奇詭異,居然都是意外死亡年枕,警方通過查閱死者的電腦和手機媳禁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画切,“玉大人,你說我怎么就攤上這事囱怕』舻” “怎么了毫别?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長典格。 經(jīng)常有香客問我岛宦,道長,這世上最難降的妖魔是什么耍缴? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任砾肺,我火速辦了婚禮,結(jié)果婚禮上防嗡,老公的妹妹穿的比我還像新娘变汪。我一直安慰自己,他們只是感情好蚁趁,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布裙盾。 她就那樣靜靜地躺著,像睡著了一般他嫡。 火紅的嫁衣襯著肌膚如雪番官。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天钢属,我揣著相機與錄音徘熔,去河邊找鬼。 笑死淆党,一個胖子當著我的面吹牛酷师,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宁否,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窒升,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慕匠?” 一聲冷哼從身側(cè)響起饱须,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎台谊,沒想到半個月后蓉媳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锅铅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年酪呻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐须。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玩荠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阶冈,我是刑警寧澤闷尿,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站女坑,受9級特大地震影響填具,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匆骗,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一劳景、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸凶朗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骏庸,卻和暖如春毛甲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背具被。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工玻募, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人一姿。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓七咧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叮叹。 傳聞我的和親對象是個殘疾皇子艾栋,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 導(dǎo)讀 最近經(jīng)常在關(guān)注的公眾號或者技術(shù)網(wǎng)站看到關(guān)于 iOS 深拷貝與淺拷貝的話題◎韧纾看到一篇技術(shù)文章蝗砾,點擊收藏或者只是...
    獨木舟的木閱讀 674評論 0 8
  • 深拷貝和淺拷貝這個問題在面試中常常被問到,而在實際開發(fā)中携冤,只要稍有不慎悼粮,就會在這里出現(xiàn)問題。尤其對于初學(xué)者來說曾棕,我...
    西門淋雨閱讀 1,786評論 0 1
  • 疑問癌幕? 上篇文章主要介紹的內(nèi)容是對字符串的深淺拷貝,那么其他類型的深淺拷貝也是一樣的嗎瀑凝? 集合的深淺拷貝吶序芦?N...
    struggle3g閱讀 961評論 0 1
  • 一說到書法,第一時間想到的一定是龍飛鳳舞的毛筆字粤咪。 書法最開始就是寫字,上小學(xué)時每天中午有一堂大字課渴杆,練毛筆字寥枝,不...
    白癡老貓閱讀 992評論 7 7
  • 我看中央一臺頻道《開講啦》節(jié)目里面的一個小片段,讓我記憶深刻磁奖,難以忘記囊拜。 一個女孩和男孩的故事。 女孩坐車到城里來...
    4b4d73e83823閱讀 171評論 0 0