對象拷貝主要由兩種方式:copy和mutableCopy。淺拷貝是指直接將指針指向原有的地址,從而達到復(fù)制的目的。深拷貝是指重新生成一個對象,將原有對象的內(nèi)容復(fù)制到新的對象中。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];//如果調(diào)用add object:則會在運行時報錯,但是編譯時并不會報錯(弱語法) NSMutableArray *arrayMutableCopy=[muArray mutableCopy]; NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy); [a release]; [muArray release]; [arrayMutableCopy release]; [arrayCopy release]; return 0;}
打印出來的結(jié)果是
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;}
打印出來的結(jié)果是
2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2
可以看出使用copy出來的對象地址與原地址一樣,也就是其實是同一個對象。且引用計數(shù)器也是2。
與所有容器類一樣,NSArray中存放的依舊是指針。并不是對象本身,其實數(shù)組中每個元素都是對象的地址。當我們使用淺拷貝時我們大部分人都能注意到對象共有的問題。如:
int main(int argc, const char * argv[]){ NSMutableArray *muArray=[[NSMutableArray alloc] init]; //定義一個ClassA類,僅作測試用無實際意義 ClassA *a=[[ClassA alloc] init]; a.val=1;//原數(shù)組中,第一個對象的val是1 [muArray addObject:a]; NSArray *arrayCopy=[muArray copy]; ClassA *b=arrayCopy[0]; b.val=2;//將淺拷貝的數(shù)組,第一個元素的val變?yōu)? NSLog(@"%ld",[muArray[0] val]); [a release]; [muArray release]; [arrayCopy release]; return 0;}
打印結(jié)果為
2015-01-23 12:21:32.972 Test[3443:303] 2
即使是深拷貝,依然對原來的數(shù)組造成了影響。
因為存放的都是地址,所以深拷貝時,將全部的地址拷了過去,但是還是指向同一個對象。
新聞熱點
疑難解答