看了下OC的 copy和mutableCopy記錄下:
//? ? #define address(obj) NSLog(@"%p", obj);
/*
不可變copy淺拷貝(指針拷貝), mutableCopy深拷貝(值拷貝)
*/
//? ? NSString *a = @"123";
//? ? address(a)
//? ? address(a.copy)
//? ? address(a.mutableCopy)
/*
可變的copy, mutableCopy都是深拷貝,都是值拷貝乾吻,內(nèi)存拷貝
*/
//? ? NSMutableString *a = [NSMutableString stringWithFormat:@"123"];
//? ? address(a)
//? ? address(a.copy)
//? ? address(a.mutableCopy)
/*
NSArray object只是指針的拷貝萍倡,不會(huì)拷貝值返弹,本身的拷貝,copy淺拷貝奔浅, mutableCopy深拷貝
*/
//? ? NSArray *arr = @[@"123",@"345"];
////? ? address(arr)
//? ? address(arr.firstObject)
//
//? ? NSArray *arr2 = arr.copy;
////? ? address(arr2)
//? ? address(arr2.firstObject)
//
//? ? NSArray *arr3 = arr.mutableCopy;
////? ? address(arr3)
//? ? address(arr3.firstObject)
/*
NSMutableArray 本身的copy, mutableCopy都是深拷貝, object只是指針拷貝
*/
//? ? NSMutableArray *arr = [NSMutableArray arrayWithObjects:@1,@2,@3, nil];
//? ? address(arr)
//? ? address(arr.firstObject)
//
//? ? NSMutableArray *arr2 = arr.copy;
//? ? address(arr2)
//? ? address(arr2.firstObject)
//
//? ? NSMutableArray *arr3 = arr.mutableCopy;
//? ? address(arr3)
//? ? address(arr3.firstObject)
/*
1:所謂淺拷貝于颖,實(shí)際上是這樣的:一個(gè)指針,指向一塊內(nèi)存1酿箭, 對(duì)這塊內(nèi)存進(jìn)行淺拷貝,其實(shí)就是提取了 這塊內(nèi)存的地址趾娃,然后把他給另外一個(gè) 8字節(jié)的指針類型存放缭嫡,這時(shí)候淺拷貝的意義就是 多了一個(gè)8字節(jié)(64位系統(tǒng))的指針,同樣指向這塊內(nèi)存抬闷,綜合來看妇蛀,內(nèi)存并未有任何變化,但是現(xiàn)在有兩個(gè)指針指向它,
并且這兩個(gè)指針存放的值一樣评架,就是這塊內(nèi)存的首地址眷茁,但是 這兩個(gè)指針本身的值(8字節(jié))不一樣,所以就是:兩個(gè)不同的指針指向同一塊內(nèi)存
2:所謂深拷貝:實(shí)際上是這樣: 一個(gè)指針纵诞,指向了一塊內(nèi)存1蔼卡,對(duì)這塊內(nèi)存1進(jìn)行深拷貝,首先挣磨,我要開辟一塊跟這塊內(nèi)存一樣大的內(nèi)存2,然后把內(nèi)存1里面的值(請(qǐng)注意荤懂,這里是值)絲毫不差的拷貝到內(nèi)存2里面去茁裙,然后再搞一個(gè)指針,指向內(nèi)存2节仿,這時(shí)候來看晤锥,有兩塊內(nèi)存了,并且兩塊內(nèi)存毫不相干廊宪,只是里面的值一樣而已矾瘾。 修改其中一個(gè)并不會(huì)影響另外一個(gè)
3:完全拷貝:深拷貝 請(qǐng)記住是內(nèi)存里面的值拷貝,如果內(nèi)存里面放的都是一些基本類型箭启,比如char int long 等等壕翩,無所謂, 但如果是指針類型或者對(duì)象類型傅寡,深拷貝只能保證拷貝到第一層放妈,也就是如果有指針類型,他只拷貝了指針的值荐操。
想象一下:如果內(nèi)存1里面有個(gè)指針芜抒,指向了一個(gè)對(duì)象a, 這時(shí)候?qū)?nèi)存1進(jìn)行深拷貝得到了內(nèi)存2,我們知道深拷貝是值拷貝托启,這時(shí)候內(nèi)存2里面同樣有一個(gè)指針指向了對(duì)象a 宅倒,因?yàn)樗麄z存的指針類型的值是一摸一樣的,所以深拷貝不能保證其內(nèi)部指針指向的對(duì)象的拷貝屯耸。 這也就是為什么深拷貝的對(duì)象必須也要實(shí)現(xiàn)nscopy協(xié)議 才能實(shí)現(xiàn)第二層也能實(shí)現(xiàn)深拷貝拐迁,否則就是淺拷貝
總結(jié):淺拷貝一定是這塊內(nèi)存首地址指針拷貝,深拷貝一定是這塊內(nèi)存所有值(包括指針的值)的值拷貝疗绣。如果你想實(shí)現(xiàn)完全拷貝唠亚,那么請(qǐng)讓你內(nèi)存中所有指針?biāo)赶虻膶?duì)象實(shí)現(xiàn)nscopying協(xié)議,否則深拷貝只能完全拷貝第一層持痰,拷貝不到第二層
*/