iOS 模型數(shù)組拷貝深度解析

這幾天公司上線一個項目,改bug過程中,就遇到一個數(shù)組拷貝問題翎猛,廢了半天勁兒才解決掉,特此詳細(xì)研究了一下接剩。其場景大概如下:

A數(shù)組中存放著好多個自定義模型Person切厘,Person模型中又有一個數(shù)組屬性modelArray,modelArray數(shù)組又包含另外一個模型Son懊缺。此時疫稿,需要將A數(shù)組元素拷貝到B數(shù)組中,并且修改B數(shù)組中元素桐汤,不能影響到A數(shù)組而克。

首先靶壮,先不管上面的場景如何解決怔毛,因為文章末尾會給出具體解決方案。這里我們將由淺入深腾降,從深拷貝和淺拷貝概念拣度,到簡單數(shù)組元素拷貝,再到模型數(shù)組元素拷貝,逐步進(jìn)行分析抗果。

一筋帖、深拷貝和淺拷貝概念

這里引入官方到一段話:

There are two kinds of object copying: shallow copies and deep copies. The normal copy is a shallow copy that produces a new collection that shares ownership of the objects with the original. Deep copies create new objects from the originals and add those to the new collection.

大致意思是:
共有兩種類型的對象拷貝:淺拷貝和深拷貝。普通拷貝是淺拷貝冤馏,它生成一個新集合日麸,該集合與原有集合共同持有對象。深拷貝會從原有集合中生成新的對象逮光,并把這些對象添加到新的集合中代箭。
簡而言之,淺拷貝不會產(chǎn)生新的對象涕刚,深拷貝會產(chǎn)生新的對象嗡综。

圖1 Shallow copies and deep copies

二、裝有基本類型元素的數(shù)組拷貝

2.1杜漠、NSArray與copy

NSArray *normalArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
id tempArray = [normalArray copy];
[tempArray isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組"); 

打印斷點极景、查看結(jié)果如下:


圖2

結(jié)論:不可變數(shù)組進(jìn)行copy,不會開辟新的內(nèi)存空間驾茴,生成一個不可變對象盼樟,指向同一個數(shù)組

2.2沟涨、NSMutableArray與copy

NSMutableArray *normalArray = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
id tempArray = [normalArray copy];
[tempArray isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
normalArray[0] = @"1000";//修改數(shù)組元素
NSLog(@"normalArray內(nèi)存地址 = %p",normalArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempArray);
NSLog(@"normalArray = %@",normalArray);
NSLog(@"tempArrayOne = %@",tempArray);

打印斷點恤批、查看結(jié)果如下:


圖3

結(jié)論:可變數(shù)組進(jìn)行copy,會開辟新的內(nèi)存空間裹赴,生成一個新的不可變數(shù)組喜庞,兩個數(shù)組之間不受任何影響

2.3棋返、NSArray與mutableCopy

NSArray *normalArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
id tempArray = [normalArray mutableCopy];
[tempArray isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
tempArray[0] = @"1000";//改變數(shù)組
NSLog(@"normalArray內(nèi)存地址 = %p",normalArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempArray);
NSLog(@"normalArray內(nèi)存地址 = %p",normalArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempArray); 

打印斷點延都、查看結(jié)果如下:

圖4

結(jié)論:不可變數(shù)組進(jìn)行mutableCopy,會開辟新的內(nèi)存空間睛竣,生成一個可變數(shù)組晰房、兩個數(shù)組之間相互不影響

2.4射沟、NSMutableArray與mutableCopy

NSMutableArray *normalArray = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
id tempArrayOne = [normalArray mutableCopy];
[tempArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
normalArray[0] = @"1000";
NSLog(@"normalArray = %@",normalArray);
NSLog(@"normalArray內(nèi)存地址 = %p",normalArray);
NSLog(@"tempArrayOne = %@",tempArrayOne);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempArrayOne); 

打印斷點殊者、查看結(jié)果如下:


圖5

結(jié)論:可變數(shù)組進(jìn)行mutableCopy,會開辟新的內(nèi)存空間验夯、生成一個可變數(shù)組猖吴、兩個數(shù)組之間相互不影響

小結(jié):
針對上述情況挥转,在網(wǎng)上找到一個繪制好的列表海蔽,總結(jié)的很好共屈,這里直接借用一下,在此謝過党窜。

圖6

三拗引、裝有模型元素的數(shù)組拷貝

這里可以明確告訴大家,數(shù)組仍然遵循上述規(guī)則幌衣,但是模型是不拷貝的矾削,要不然也不用這么費勁兒寫這篇文章了。
這里我們用裝有模型的可變數(shù)組的mutableCopy進(jìn)行驗證豁护,代碼如下:

//1怔软、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
onePerson.age = 1;
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2、拷貝數(shù)組
id tempModelArrayOne = [normalModelArray mutableCopy];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3择镇、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne);

打印斷點挡逼、查看結(jié)果如下:


圖7

結(jié)論:數(shù)組拷貝仍然遵循上面的規(guī)則,但是里面的模型是同一個對象腻豌,也就是說對象沒有進(jìn)行深拷貝家坎。

四、模型深度拷貝最終解決方案

4.1吝梅、方案介紹

數(shù)組里面的模型不能拷貝虱疏,我們該怎么辦?放心苏携,官方已經(jīng)給出答案:

There are two ways to make deep copies of a collection. You can use the collection’s equivalent of initWithArray:copyItems: with YES as the second parameter. If you create a deep copy of a collection in this way, each object in the collection is sent a copyWithZone: message. If the objects in the collection have adopted the NSCopying protocol, the objects are deeply copied to the new collection, which is then the sole owner of the copied objects. If the objects do not adopt the NSCopying protocol, attempting to copy them in such a way results in a runtime error. However, copyWithZone: produces a shallow copy. This kind of copy is only capable of producing a one-level-deep copy. If you only need a one-level-deep copy, you can explicitly call for one as in Listing 2.
Listing 2 Making a deep copy
NSArray *deepCopyArray = [[NSArray alloc]initWithArray:someArray copyItems:YES];
This technique applies to the other collections as well. Use the collection’s equivalent of initWithArray:copyItems: with YES as the second parameter.
If you need a true deep copy, such as when you have an array of arrays, you can archive and then unarchive the collection, provided the contents all conform to the NSCoding protocol. An example of this technique is shown in Listing 3.
Listing 3 A true deep copy
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

大致意思如下:
這里有兩種方法可以實現(xiàn)深拷貝做瞪,第一種方法是initWithArray:copyItems: with YES as the second parameter。用這個方法進(jìn)行拷貝右冻,集合里面的模型就要實現(xiàn)copyWithZone:方法装蓬;如果不實現(xiàn)的話,就會報運行時錯誤纱扭。因為copyWithZone:是淺拷貝牍帚,所以這里只會對模型的基本屬性進(jìn)行拷貝。換句話說乳蛾,模型本身的屬性都會進(jìn)行深拷貝暗赶,但是如果模型屬性還包含模型,那這個方法就無濟于事了肃叶。此時蹂随,只能用NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

4.2因惭、方案實踐

看了官方的介紹岳锁,貌似有點茅塞頓開的感覺,可是不試一試怎么能夠知道呢筛欢。
這里我們將從三個方面對兩個方法進(jìn)行對比分析浸锨。

4.2.1、initWithArray:copyItems

  • 1>基本模型
    代碼如下:
//1版姑、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2柱搜、拷貝數(shù)組
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:normalModelArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3、改變其中一個元素信息
onePerson.name = @"我改變了哈";
//4剥险、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne); 

打印結(jié)果如下:


圖8 copyItems(基本元素)

結(jié)論:生成新的Person模型聪蘸,開辟新的存儲空間,Person模型基本元素相互不影響表制。

  • 2>模型中含有模型
    代碼如下:
 //1健爬、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
onePerson.son.name = @"張三";
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2、拷貝數(shù)組
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:normalModelArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3么介、改變其中一個元素信息
onePerson.name = @"我改變了哈";
onePerson.son.name = @"李四";
//4娜遵、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne);

打印結(jié)果如下:


圖9 copyItems(模型中的模型).png

結(jié)論:生成新的Son模型,開辟新的存儲空間壤短,Son模型基本元素相互不影響设拟。

  • 3>模型中的數(shù)組屬性含有模型
    代碼如下:
//1、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
Son *son = [[Son alloc] init];
son.name = @"兒子";
[onePerson.modelArray addObject:son];
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2久脯、拷貝數(shù)組
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:normalModelArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3纳胧、改變其中一個元素信息
son.name = @"改變兒子";
//4、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne); 

打印結(jié)果如下:


圖10 copyItems(模型中的數(shù)組).png

結(jié)論:主模型數(shù)組中的模型不會開辟新的內(nèi)存空間帘撰,仍然是同一個對象跑慕。

4.2.2、歸檔和解檔

  • 1>基本模型
//1摧找、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2核行、歸檔和解檔
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:normalModelArray]];
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:trueDeepCopyArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3、改變其中一個元素信息
onePerson.name = @"我改變了哈";
//4蹬耘、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);    NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne); 

打印結(jié)果:


圖11 歸檔(基本元素).png

結(jié)論:生成新的Person模型钮科,開辟新的存儲空間,Person模型基本元素相互不影響婆赠。

  • 2>模型中含有模型
    代碼如下:
//1绵脯、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
onePerson.son.name = @"張三";
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2、歸檔和接檔
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:normalModelArray]];
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:trueDeepCopyArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3休里、改變其中一個元素信息
onePerson.name = @"我改變了哈";
onePerson.son.name = @"李四";
//4蛆挫、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne);

打印結(jié)果如下:


圖12 歸檔(模型中的模型).png

結(jié)論:生成新的Son模型,開辟新的存儲空間妙黍,Son模型基本元素相互不影響悴侵。

  • 3>模型中的數(shù)組屬性含有模型
    代碼如下:
//1、初始數(shù)組
Person *onePerson = [[Person alloc] init];
onePerson.name = @"onePerson";
Son *son = [[Son alloc] init];
son.name = @"兒子";
[onePerson.modelArray addObject:son];
NSMutableArray *normalModelArray = [[NSMutableArray alloc] init];
[normalModelArray addObject:onePerson];
//2拭嫁、歸檔和解檔
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:normalModelArray]];
id tempModelArrayOne = [[NSMutableArray alloc] initWithArray:trueDeepCopyArray copyItems:YES];
[tempModelArrayOne isKindOfClass:[NSMutableArray class]] ? NSLog(@"tempArrayOne可變數(shù)組"):NSLog(@"tempArrayOne不可變數(shù)組");
//3可免、改變其中一個元素信息
son.name = @"改變兒子";
//4抓于、打印模型信息
NSLog(@"normalArray = %@",normalModelArray);
NSLog(@"tempArrayOne = %@",tempModelArrayOne);
NSLog(@"normalArray內(nèi)存地址 = %p",normalModelArray);
NSLog(@"tempArrayOne內(nèi)存地址 = %p",tempModelArrayOne);

打印結(jié)果:


圖13 歸檔(模型中的數(shù)組).png

結(jié)論:主模型數(shù)組中的模型會開辟新的內(nèi)存空間,模型之間相互不影響浇借。

五捉撮、總結(jié)

5.1、方案

通過initWithArray:copyItems歸檔解檔可以對模型進(jìn)行拷貝妇垢,具體如下:

//方案1
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
//方案2
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

使用initWithArray:copyItems需要模型遵守NSCopying或NSMutableCopying協(xié)議并重寫以下方法:

- (id)copyWithZone:(NSZone *)zone
{
    Person *person = [[[self class] allocWithZone:zone] init];
    person.name = [self.name copy];
    person.age = self.age;
    person.son = [self.son copy];
    person.modelArray = [self.modelArray copy];
    return person;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    Person *person = [[[self class] allocWithZone:zone] init];
    person.name = [self.name mutableCopy];
    person.age = self.age;
    person.son = [self.son mutableCopy];
    person.modelArray = [self.modelArray mutableCopy];
    return person;
}

使用歸檔和解檔需要模型遵守NSCoding協(xié)議并重寫以下方法:

- (id)initWithCoder: (NSCoder *)coder
{
    if (self = [super init])
    {
        self.name = [coder decodeObjectForKey:@"name"];
        self.age = (int)[coder decodeIntegerForKey:@"age"];
        self.son = [coder decodeObjectForKey:@"son"];
        self.modelArray = [coder decodeObjectForKey:@"modelArray"];
    }
    return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
    [coder encodeObject:self.name forKey:@"name"];
    [coder encodeInteger:self.age forKey:@"age"];
    [coder encodeObject:self.son forKey:@"son"];
    [coder encodeObject:self.modelArray forKey:@"modelArray"];
}

備注: 如果模型中有嵌套子模型巾遭,子模型也需要實現(xiàn)上述方法,否則會報運行時錯誤闯估。

5.2灼舍、方案區(qū)別

二者都可以對模型進(jìn)行深拷貝,但是initWithArray:copyItems只能對一級模型進(jìn)行深拷貝涨薪,也就是模型中含有數(shù)組模型骑素,它就無能為力了。而利用歸檔和解檔則不存在這樣問題刚夺,無論模型嵌套多少層砂豌。

參考網(wǎng)址:

蘋果官方文檔

iOS 圖文并茂的帶你了解深拷貝與淺拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市光督,隨后出現(xiàn)的幾起案子阳距,更是在濱河造成了極大的恐慌,老刑警劉巖结借,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筐摘,死亡現(xiàn)場離奇詭異,居然都是意外死亡船老,警方通過查閱死者的電腦和手機咖熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柳畔,“玉大人馍管,你說我怎么就攤上這事⌒胶” “怎么了确沸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俘陷。 經(jīng)常有香客問我罗捎,道長,這世上最難降的妖魔是什么拉盾? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任桨菜,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倒得。我一直安慰自己泻红,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布霞掺。 她就那樣靜靜地躺著谊路,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根悼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天蜀撑,我揣著相機與錄音挤巡,去河邊找鬼。 笑死酷麦,一個胖子當(dāng)著我的面吹牛矿卑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沃饶,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼母廷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糊肤?” 一聲冷哼從身側(cè)響起琴昆,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馆揉,沒想到半個月后业舍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡升酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年舷暮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噩茄。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡下面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绩聘,到底是詐尸還是另有隱情沥割,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布凿菩,位于F島的核電站驯遇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓄髓。R本人自食惡果不足惜叉庐,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望会喝。 院中可真熱鬧陡叠,春花似錦玩郊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴溜,卻和暖如春侦厚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拙徽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工刨沦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘怕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓想诅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岛心。 傳聞我的和親對象是個殘疾皇子来破,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 今天來說一下iOS中的copy。 在iOS中忘古,拷貝有兩種方式徘禁,深拷貝(Deep copy)和淺拷貝(Shallow...
    張囧瑞閱讀 952評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • 1、對象拷貝有兩種方式:淺復(fù)制和深復(fù)制髓堪。顧名思義晌坤,淺復(fù)制,并不拷貝對象本身旦袋,僅僅是拷貝指向?qū)ο蟮闹羔樦璨ぃ簧顝?fù)制是直接...
    滴答大閱讀 759評論 0 2
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 859評論 0 2
  • 概念 在Objective-C中并不是所有的對象都支持Copy,MutableCopy疤孕,遵守NSCopying協(xié)議...
    LeoAu閱讀 8,724評論 10 28