深拷贝 浅拷贝

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

只有一种情况是浅拷贝:不可变对象调用copy方法时,其他情况都为深拷贝;
copy语法的目的:改变副本的时候,不会影响到源对象;
深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。

// copy代表set方法会release旧对象、copy新对象
// 修改外面的变量,并不会影响到内部的成员变量
// 建议:NSString一般用copy策略,其他对象一般用retain

NSString *string = [[NSString alloc] initWithFormat:@"abcde"];  
// copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身  
// 源对象计数器会+1  
// 在浅拷贝情况下,copy其实就相当于retain  
NSString *str = [string copy];  
NSString *string = [[NSString alloc] initWithFormat:@"abcd"];  
// 产生了一个新的对象,计数器为1。源对象的计数器不变。  
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];  
 // 会产生一个新对象,str计数器为1  
 NSString *str = [string copy];  

这个是oc版的,最近在看swift,写一个swift版

func test1() -> String {
    //        以NSMutableArray对象为源的测试:
    let arrayM:NSMutableArray = NSMutableArray.init(array: ["copy","mutableCopy"])
    print("内容:\(arrayM)  对象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  对象所属类:\(type(of:arrayM))")
    
    //将对象源copy到可变对象
    //let array1:NSMutableArray = arrayM.copy() as! NSMutableArray
    //print("内容:\(array1)  对象地址:\(Unmanaged.passUnretained(array1).toOpaque())  对象所属类:\(type(of:array1))")
    
    //将对象源mutableCopy到可变对象
    let array2:NSMutableArray = arrayM.mutableCopy() as! NSMutableArray
    print("将对象源copy到可变对象,内容:\(array2)  对象地址:\(Unmanaged.passUnretained(array2).toOpaque())  对象所属类:\(type(of:array2))")
    
    // 将对象源copy到不可变对象
    let array3:NSArray = arrayM.copy() as! NSArray
    print("将对象源copy到不可变对象,内容:\(array3)  对象地址:\(Unmanaged.passUnretained(array3).toOpaque())  对象所属类:\(type(of:array3))")
    
    //将对象源mutablCopy到不可变对象
    let array4:NSArray = arrayM.mutableCopy() as! NSArray
    print("将对象源mutablCopy到不可变对象,内容:\(array4)  对象地址:\(Unmanaged.passUnretained(array4).toOpaque())  对象所属类:\(type(of:array4))")
    
    print("修改对象源,然后再次对这五个对象进行打印分析--------------------------------分割线")
    arrayM.addObjects(from: ["test"])
    print("内容:\(arrayM)  对象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  对象所属类:\(type(of:arrayM))")
    //print("内容:\(array1)  对象地址:\(Unmanaged.passUnretained(array1).toOpaque())  对象所属类:\(type(of:array1))")
    print("将对象源copy到可变对象,内容:\(array2)  对象地址:\(Unmanaged.passUnretained(array2).toOpaque())  对象所属类:\(type(of:array2))")
    print("将对象源copy到不可变对象,内容:\(array3)  对象地址:\(Unmanaged.passUnretained(array3).toOpaque())  对象所属类:\(type(of:array3))")
    print("将对象源mutablCopy到不可变对象内容:\(array4)  对象地址:\(Unmanaged.passUnretained(array4).toOpaque())  对象所属类:\(type(of:array4))")
    return "以NSMutableArray对象为源的测试:"
}

func test2() -> String {
    //以不可变的NSArray作为对象源
    let arrayM:NSArray = ["copy","mutablecopy"]
    print("内容:\(arrayM)  对象地址:\(Unmanaged.passUnretained(arrayM).toOpaque())  对象所属类:\(type(of:arrayM))")
    
//    将对象源copy到可变对象
    let array1:NSMutableArray = arrayM.copy() as! NSMutableArray
    print("将对象源copy到可变对象,内容:\(array1)  对象地址:\(Unmanaged.passUnretained(array1).toOpaque())  对象所属类:\(type(of:array1))")

    //只有一种情况是浅拷贝:不可变对象调用copy方法时,其他情况都为深拷贝;
//    下面没有意义了
//    将对象源mutableCopy到可变对象
    
//    将对象源copy到不可变对象
    
//    将对象源mutablCopy到不可变对象
    
    
    return "以不可变的NSArray作为对象源"
}

你可能感兴趣的:(深拷贝 浅拷贝)