深拷貝 淺拷貝

http://www.aichengxu.com/view/1161409

只有一種情況是淺拷貝:不可變對象調(diào)用copy方法時,其他情況都為深拷貝;
copy語法的目的:改變副本的時候,不會影響到源對象;
深拷貝:內(nèi)容拷貝,會產(chǎn)生新的對象。新對象計數(shù)器置為1,源對象計數(shù)器不變。
淺拷貝:指針拷貝,不會產(chǎn)生新的對象。源對象計數(shù)器+1。

// copy代表set方法會release舊對象、copy新對象
// 修改外面的變量,并不會影響到內(nèi)部的成員變量
// 建議:NSString一般用copy策略,其他對象一般用retain

NSString *string = [[NSString alloc] initWithFormat:@"abcde"];  
// copy產(chǎn)生的是不可變副本,由于源對象本身就不可變,所以為了性能著想,copy會直接返回源對象本身  
// 源對象計數(shù)器會+1  
// 在淺拷貝情況下,copy其實就相當于retain  
NSString *str = [string copy];  
NSString *string = [[NSString alloc] initWithFormat:@"abcd"];  
// 產(chǎn)生了一個新的對象,計數(shù)器為1。源對象的計數(shù)器不變。  
NSMutableString *str = [string mutableCopy];//此時存在兩個對象// str:1和// string:1  
 // str和string不是相同對象  
 // NSLog(@"%i", str == string);//0  
 [str appendString:@" abcd"];//修改str不影響string  
 NSLog(@"string:%@", string);  
 NSLog(@"str:%@", str);  
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];  
 // 會產(chǎn)生一個新對象,str計數(shù)器為1  
 NSString *str = [string copy];  

這個是oc版的,最近在看swift,寫一個swift版

func test1() -> String {
    //        以NSMutableArray對象為源的測試:
    let arrayM:NSMutableArray = NSMutableArray.init(array: ["copy","mutableCopy"])
    print("內(nèi)容:\(arrayM)  對象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  對象所屬類:\(type(of:arrayM))")
    
    //將對象源copy到可變對象
    //let array1:NSMutableArray = arrayM.copy() as! NSMutableArray
    //print("內(nèi)容:\(array1)  對象地址:\(Unmanaged.passUnretained(array1).toOpaque())  對象所屬類:\(type(of:array1))")
    
    //將對象源mutableCopy到可變對象
    let array2:NSMutableArray = arrayM.mutableCopy() as! NSMutableArray
    print("將對象源copy到可變對象,內(nèi)容:\(array2)  對象地址:\(Unmanaged.passUnretained(array2).toOpaque())  對象所屬類:\(type(of:array2))")
    
    // 將對象源copy到不可變對象
    let array3:NSArray = arrayM.copy() as! NSArray
    print("將對象源copy到不可變對象,內(nèi)容:\(array3)  對象地址:\(Unmanaged.passUnretained(array3).toOpaque())  對象所屬類:\(type(of:array3))")
    
    //將對象源mutablCopy到不可變對象
    let array4:NSArray = arrayM.mutableCopy() as! NSArray
    print("將對象源mutablCopy到不可變對象,內(nèi)容:\(array4)  對象地址:\(Unmanaged.passUnretained(array4).toOpaque())  對象所屬類:\(type(of:array4))")
    
    print("修改對象源,然后再次對這五個對象進行打印分析--------------------------------分割線")
    arrayM.addObjects(from: ["test"])
    print("內(nèi)容:\(arrayM)  對象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  對象所屬類:\(type(of:arrayM))")
    //print("內(nèi)容:\(array1)  對象地址:\(Unmanaged.passUnretained(array1).toOpaque())  對象所屬類:\(type(of:array1))")
    print("將對象源copy到可變對象,內(nèi)容:\(array2)  對象地址:\(Unmanaged.passUnretained(array2).toOpaque())  對象所屬類:\(type(of:array2))")
    print("將對象源copy到不可變對象,內(nèi)容:\(array3)  對象地址:\(Unmanaged.passUnretained(array3).toOpaque())  對象所屬類:\(type(of:array3))")
    print("將對象源mutablCopy到不可變對象內(nèi)容:\(array4)  對象地址:\(Unmanaged.passUnretained(array4).toOpaque())  對象所屬類:\(type(of:array4))")
    return "以NSMutableArray對象為源的測試:"
}

func test2() -> String {
    //以不可變的NSArray作為對象源
    let arrayM:NSArray = ["copy","mutablecopy"]
    print("內(nèi)容:\(arrayM)  對象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  對象所屬類:\(type(of:arrayM))")
    
//    將對象源copy到可變對象
    let array1:NSMutableArray = arrayM.copy() as! NSMutableArray
    print("將對象源copy到可變對象,內(nèi)容:\(array1)  對象地址:\(Unmanaged.passUnretained(array1).toOpaque())  對象所屬類:\(type(of:array1))")

    //只有一種情況是淺拷貝:不可變對象調(diào)用copy方法時,其他情況都為深拷貝;
//    下面沒有意義了
//    將對象源mutableCopy到可變對象
    
//    將對象源copy到不可變對象
    
//    將對象源mutablCopy到不可變對象
    
    
    return "以不可變的NSArray作為對象源"
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容