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作为对象源"
}