国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

copy和mutableCopy的深、淺拷貝

2019-11-14 19:37:39
字體:
來源:轉載
供稿:網友

對象拷貝主要由兩種方式:copy和mutableCopy。淺拷貝是指直接將指針指向原有的地址,從而達到復制的目的。深拷貝是指重新生成一個對象,將原有對象的內容復制到新的對象中。copy 返回的是一個不可變的對象,mutableCpoy返回的是一個可變的對象,但是由于OC的弱語法特性,即使如下使用編譯器也不會報錯。但是再運行時,arrayCopy會找不到具體的方法,報錯。

NSMutableArray *arrayCopy=[muArray copy];

copy當所引用的對象是可變的時,則是深拷貝,如果是不可變對象則是淺拷貝。mutableCopy 不管對象是否為可變,都是深拷貝。

int main(int argc, const char * argv[]){        NSMutableArray *muArray=[[NSMutableArray alloc] init];        //定義一個ClassA類,僅作測試用無實際意義    ClassA *a=[[ClassA alloc] init];    [muArray addObject:a];        NSMutableArray *arrayCopy=[muArray copy];//如果調用add object:則會在運行時報錯,但是編譯時并不會報錯(弱語法)    NSMutableArray *arrayMutableCopy=[muArray mutableCopy];        NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy);        [a release];    [muArray release];    [arrayMutableCopy release];    [arrayCopy release];    return 0;}

打印出來的結果是

2015-01-23 12:06:58.342 Test[3375:303] 0x100100d40---0x1001023b0----0x100105020

可以看出地址都不相同。

int main(int argc, const char * argv[]){    NSArray *array=@[@1,@2,@3];        NSArray *arrayCopy=[array copy];    NSMutableArray *arrayMutableCopy=[array mutableCopy];        NSLog(@"%p---%p----%p----%ld",arrayCopy,array,arrayMutableCopy,[arrayCopy retainCount]);        [arrayMutableCopy release];    [arrayCopy release];    return 0;}

打印出來的結果是

 

2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2

可以看出使用copy出來的對象地址與原地址一樣,也就是其實是同一個對象。且引用計數器也是2。

與所有容器類一樣,NSArray中存放的依舊是指針。并不是對象本身,其實數組中每個元素都是對象的地址。當我們使用淺拷貝時我們大部分人都能注意到對象共有的問題。如:

int main(int argc, const char * argv[]){    NSMutableArray *muArray=[[NSMutableArray alloc] init];            //定義一個ClassA類,僅作測試用無實際意義    ClassA *a=[[ClassA alloc] init];    a.val=1;//原數組中,第一個對象的val是1    [muArray addObject:a];        NSArray *arrayCopy=[muArray copy];    ClassA *b=arrayCopy[0];    b.val=2;//將淺拷貝的數組,第一個元素的val變為2        NSLog(@"%ld",[muArray[0] val]);        [a release];    [muArray release];    [arrayCopy release];    return 0;}

打印結果為

2015-01-23 12:21:32.972 Test[3443:303] 2

即使是深拷貝,依然對原來的數組造成了影響。

 


因為存放的都是地址,所以深拷貝時,將全部的地址拷了過去,但是還是指向同一個對象。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深州市| 南澳县| 湟源县| 永昌县| 鹤岗市| 托里县| 儋州市| 兴业县| 饶阳县| 曲松县| 化隆| 萨嘎县| 江城| 砚山县| 石家庄市| 宁城县| 建昌县| 蓬安县| 金华市| 潮州市| 方山县| 平谷区| 上饶县| 麟游县| 凌海市| 仙游县| 蕉岭县| 天柱县| 福海县| 来凤县| 临泉县| 临清市| 江安县| 星子县| 绥德县| 抚顺市| 岳西县| 郓城县| 黄骅市| 和龙市| 桂平市|