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作為對象源"
}