iOS 數(shù)組元素的深拷貝

  • 需求:一個對象數(shù)組,然后想將這個數(shù)組拷貝出來一份用,修改拷貝的這份數(shù)組,保持原始數(shù)據(jù)不被改變.
  • 如果數(shù)組的元素是對象(比如是個model) 需要實(shí)現(xiàn),
    <NSCopying,NSMutableCopying>
    (NSMutableArray,NSArray,NSString等實(shí)現(xiàn)了該協(xié)議)
  • 協(xié)議對應(yīng)方法:
    - (id)copyWithZone:(nullable NSZone *)zone
    - (id)mutableCopyWithZone:(nullable NSZone *)zone
  • 舉例:
實(shí)現(xiàn) NSCopying,NSMutableCopying 協(xié)議
如果用NSCopying 實(shí)現(xiàn):
 - (id)copyWithZone:(nullable NSZone *)zone
如果用NSMutableCopying 實(shí)現(xiàn):
  - (id)mutableCopyWithZone:(nullable NSZone *)zone
Model
@interface Model : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic, copy) NSString *str1;
@property (nonatomic, copy) NSString *str2;
@end 
@implementation Model
  - (id)copyWithZone:(nullable NSZone *)zone{
 Model *person = [[self class] allocWithZone:zone];
 person.str1 = [_str1 copy];
 person.str2 = [_str2 copy];
 return person;
}
  - (id)mutableCopyWithZone:(nullable NSZone *)zone{
 Model *person = [[self class] allocWithZone:zone];
 person.str1 = [_str1 copy];
 person.str2 = [_str2 copy];
 return person;
}
@end
  • 實(shí)現(xiàn)了協(xié)議以后,那么該對象就可以進(jìn)行拷貝了,下面說說數(shù)組是怎么回事
//構(gòu)造一個Model 數(shù)組
  NSMutableArray *arr = [NSMutableArray array];
  for (int i = 0; i< 3; i++) {
  Model *model = [[Model alloc] init];
  model.str1 = @"1";
  model.str2 = @"2";
  NSLog(@"數(shù)組%d:---%p",i,model);
  [arr addObject:model];
  }
那么我想拷貝數(shù)組對象,直接
NSMutableArray *arr1 = [arr mutableCopy];
是不是這樣就可以了
arr內(nèi)存地址:0x7f8d8b7972a0
arr1內(nèi)存地址:0x7f8d8b796fe0
顯然是不一樣的,那么你會說這樣就可以了,其實(shí)你想多了,斷點(diǎn)后看兩個數(shù)組的元素的地址改變了沒有:
結(jié)果:po arr
<__NSArrayM 0x7f8d8b7972a0>(
<Model: 0x7f8d8b78f110>,
<Model: 0x7f8d8b52b470>,
<Model: 0x7f8d8b408830>
)
po arr1
<__NSArrayM 0x7f8d8b796fe0>(
<Model: 0x7f8d8b78f110>,
<Model: 0x7f8d8b52b470>,
<Model: 0x7f8d8b408830>
)
  • 元素對象是一樣的,地址完全一樣,所以說數(shù)組的指針變了,但是數(shù)組元素是沒有變的,該如何解決呢?先上一段代碼.
  NSMutableArray *arr = [NSMutableArray array];
  for (int i = 0; i< 3; i++) {
  Model *model = [[Model alloc] init];
  model.str1 = @"1";
  model.str2 = @"2";
  NSLog(@"數(shù)組%d:---%p",i,model);
  [arr addObject:model];
  }
  NSMutableArray *arr1 = [NSMutableArray array];
  for (Model *model in arr) {
  [arr1 addObject:[model copy]];//這里的copy,就是將arr數(shù)組里的每一個對象拷貝一份.
//所以Model對象實(shí)現(xiàn)- (id)copyWithZone:(nullable NSZone *)zone方法
  }
  • 解決方法

  • 目前我想到的是遍歷數(shù)組 將數(shù)組元素深拷貝出來添加到另一個數(shù)組里.如果有同學(xué)想到了其他更好的方法希望能告知我,謝謝.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末争剿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痊末,更是在濱河造成了極大的恐慌蚕苇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿叠,死亡現(xiàn)場離奇詭異涩笤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盒件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蹬碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人履恩,你說我怎么就攤上這事锰茉。” “怎么了切心?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵飒筑,是天一觀的道長。 經(jīng)常有香客問我绽昏,道長协屡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任全谤,我火速辦了婚禮肤晓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己补憾,他們只是感情好漫萄,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盈匾,像睡著了一般腾务。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上削饵,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天岩瘦,我揣著相機(jī)與錄音,去河邊找鬼窿撬。 笑死启昧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劈伴。 我是一名探鬼主播密末,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宰啦!你這毒婦竟也來了苏遥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赡模,失蹤者是張志新(化名)和其女友劉穎田炭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓柑,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡教硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞬矩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锋玲。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惭蹂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媚污,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布耗美,位于F島的核電站,受9級特大地震影響商架,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甸私,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皇型。 院中可真熱鬧弃鸦,春花似錦、人聲如沸唬格。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽门粪。三九已至,卻和暖如春玄妈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拟蜻。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酝锅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓爸舒,卻偏偏與公主長得像坚冀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舌稀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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

  • 最近有個需求需要copy數(shù)組對象才發(fā)現(xiàn)之前一直不太了解深淺copy就隨手寫了個小demo研究下。 1,NSObje...
    xinmai閱讀 2,259評論 1 4
  • 設(shè)計(jì)模式是什么咒林? 你知道哪些設(shè)計(jì)模式,并簡要敘述垫竞? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 751評論 0 4
  • 設(shè)計(jì)模式是什么欢瞪? 你知道哪些設(shè)計(jì)模式徐裸,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)重贺,就是用比較成熟的邏輯去處理某一種類型的...
    如果我們是朋友閱讀 675評論 0 9
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式气笙,并簡要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)潜圃,就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,226評論 1 21
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式秉犹,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)崇堵,就是用比較成熟的邏輯去處理某一種類型的...
    不懂后悔閱讀 826評論 0 53