代碼測試深拷貝 淺拷貝
原因
以前只是知道 一個對象copy了之后毕源,再改變copy之后的值猪腕,就不會影響原來的值姜胖,一直對深copy烙肺,淺copy 的原理 不太清楚纳猪。但是面試的時候 面試官總是要問深copy 淺copy 的原理,只好自己實現(xiàn)下了桃笙。
介紹
主要測試 NSString 和 NSMutableString
1.測試 NSString
廢話少說 上代碼
/** 測試NSString 內存地址 copy */
-(void)testString{
NSString *a1 = @"123";
NSLog(@"---- a1 指針內存地址:%p,指針所指向對象的地址:%p \n",&a1,a1);
NSString *b1= a1;
NSLog(@"---- b1 指針內存地址:%p,指針所指向對象的地址:%p \n",&b1,b1);
NSString *a1Copy = [a1 copy];
NSLog(@"---- a1Copy 指針內存地址:%p,指針所指向對象的地址:%p \n",&a1Copy,a1Copy);
}
輸出結果
2017-06-06 11:11:32.411 test[20279:7298589] ---- a1 指針內存地址:0x7fff57ddda58,指針所指向對象的地址:0x107e22068
2017-06-06 11:11:32.411 test[20279:7298589] ---- b1 指針內存地址:0x7fff57ddda50,指針所指向對象的地址:0x107e22068
2017-06-06 11:11:47.762 test[20279:7298589] ---- a1Copy 指針內存地址:0x7fff57ddda48,指針所指向對象的地址:0x107e22068
(lldb)
截圖說明
Paste_Image.png
結論說明
NSString 無論是 重新賦值(=),還是 copy氏堤,他們指向的對象的地址 都是相同的,所以NSString 的copy 是淺copy搏明。
2. 測試 NSMutableString
測試代碼
/** 測試 NSMutableString 內存地址 copy */
-(void)testMutableString{
NSMutableString *c1 = [[NSMutableString alloc] initWithString:@"12345678"];
NSLog(@"---- c1 指針內存地址:%p,指針所指向對象的地址:%p \n",&c1,c1);
NSString *c1Copy = [c1 copy];
NSLog(@"---- c1Copy 指針內存地址:%p,指針所指向對象的地址:%p \n",&c1Copy,c1Copy);
NSString *c1Mucopy = [c1 mutableCopy];
NSLog(@"---- c1Mucopy 指針內存地址:%p,指針所指向對象的地址:%p \n",&c1Mucopy,c1Mucopy);
[c1 appendString:@"0000"];
NSLog(@"c1=%@,c1Copy=%@,c1Mucopy=%@",c1,c1Copy,c1Mucopy );
}
輸出結果
2017-06-06 11:22:04.314 test[20398:7351851] ---- c1 指針內存地址:0x7fff5250ca58,指針所指向對象的地址:0x608000074c80
2017-06-06 11:22:04.314 test[20398:7351851] ---- c2 指針內存地址:0x7fff5250ca50,指針所指向對象的地址:0x608000074c80
2017-06-06 11:22:04.314 test[20398:7351851] ---- c1Copy 指針內存地址:0x7fff5250ca48,指針所指向對象的地址:0xa007a87dcaecc2a8
2017-06-06 11:22:04.315 test[20398:7351851] ---- c1Mucopy 指針內存地址:0x7fff5250ca40,指針所指向對象的地址:0x608000074f80
2017-06-06 11:22:07.489 test[20398:7351851] c1=123456780000,c1Copy=12345678,c1Mucopy=12345678,c2=123456780000
截圖說明
Paste_Image.png
結論說明
1.NSMutableString 賦值(=) ,原對象值改變鼠锈,賦值后的對象也會改變,指針指向對象的地址 相同星著。 2.copy购笆,mutableCopy 原對象值改變 ,copy虚循,mutableCopy 后的值都不會改變由桌,且 指針指向對象的地址不同,是 深 copy邮丰。
理解
NSMutableString 自身的值是會變得行您,所以要進行深copy(指針對象地址改變), 才能確保copy 后的對象不受原來對象改變的 影響剪廉。
NSString 自身的值是不變得娃循,copy對象是淺copy(指針對象地址相同),copy后的對象值 也不會改變斗蒋。
所以捌斧,copy 后的值都是不變的笛质。
后續(xù)
測試代碼地址: https://github.com/lizhi0123/TestCopyAddress
簡書地址: http://www.reibang.com/p/5af60f3c8d57
要是有什么不同的見解 或疑問 ,請留言捞蚂。