今天說一下深拷貝和淺拷貝
聲明本文僅供參考,因為作者能力有限不能做到十全十美,是以請大家指正錯誤的地方,歡迎大家提出問題,我回虛心接納!
copy的目的是建立一個對象的副本,對其中一個對象進行修改時,不會影響到另外一個對象中的内容
在iOS中copy包括:copy(拷貝) &
mutableCopy(可變拷貝)
由于OC Foundation中對象類型通常包括不可變版本和可變版本,是以要試驗copy操作需要測試幾種形式:
1> 可變 -> 可變
位址變化(新副本)
2> 可變 -> 不可變
3> 不可變 -> 可變
位址不變化
4> 不可變 -> 不可變
位址不變化
下面我們來看代碼:
void demoCopy1()
{
NSMutableString *strM = [NSMutableStringstringWithString:@"閃電霹靂"];
// 1> 可變 -> 可變
NSMutableString *strM1 = [strM
copy];
// [strM1 setString:@"hello"];
NSLog(@"%@ %p - %@ %p", strM, strM,
strM1, strM1);
//
2> 可變
-> 不可變
NSString *strM2 = [strM copy];
strM2, strM2);
[strM setString:@"hello"];
}
這時候你會發現上面NSMutableSting拷貝過後就在strM1指派的時候就會報錯,第2>個也是給strM2指派的時候也回報錯
接下來再看案例2
void demoCopy2()
{
NSString *str = @"閃電霹靂";
//
1> 不可變
-> 可變
NSMutableString *strM1 = [str
// [strM1 setString:@"hello"];
NSLog(@"%@ %p - %@ %p", str, str,
// 2> 不可變 ->
不可變
NSString *strM2 = [str copy];
這時候同樣,不管是NSMutableString還是Nstring拷貝過後的都不能再改變,同樣不能指派,如果指派改變就會出錯;
結論:使用Copy建立出來的都是不可變的的副本,與建立的副本類型無關;
接下來看事例3
void demoCopy3()
NSMutableString *strM =
[NSMutableStringstringWithString:@"可變字元串"];
1> 可變
mutableCopy];
[strM1 setString:@"hello strM1"];
// 2> 可變 ->
NSString *strM2 = [strM
id strM3 = strM2;
[strM3 setString:@"hello strM2"];
[strM setString:@"hello"];
這次你回發現拷貝過後不管是哪一個類型都可改變;
結論:使用mutableCopy建立出來的都是可變副本,與建立副本的類型無關
好了,深拷貝淺拷貝到這裡就OK了,有沒有對copy有根深的一層了解呢?哈哈這裡恭祝大家天天進步!!如有疑問可以聯系我,我回盡自己的能力幫助大家!!