賦值是和原對象指向同一內(nèi)存辛藻,屬于同一對象
淺拷貝拷貝對象碘橘,是新生成一個(gè)指針與原對象指向同一段內(nèi)存
1、淺拷貝
淺拷貝就是對內(nèi)存地址的復(fù)制吱肌,讓目標(biāo)對象指針和源對象指向同一片內(nèi)存空間痘拆,當(dāng)內(nèi)存銷毀的時(shí)候,指向這片內(nèi)存的幾個(gè)指針需要重新定義才可以使用氮墨,要不然會(huì)成為野指針纺蛆。
深拷貝拷貝對象本身以及屬性 ,對象包含子對象時(shí)规揪,拷貝的對象改變桥氏,原對象的子對象不會(huì)改變;
使用深拷貝的情況下猛铅,釋放內(nèi)存的時(shí)候不會(huì)因?yàn)槌霈F(xiàn)淺拷貝時(shí)釋放同一個(gè)內(nèi)存的錯(cuò)誤字支。
淺復(fù)制:僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址發(fā)生改變,那么淺復(fù)制出來的對象也會(huì)相應(yīng)的改變堕伪。
深復(fù)制:在計(jì)算機(jī)中開辟一塊新的內(nèi)存地址用于存放復(fù)制的對象揖庄。
總結(jié):
深拷貝就是內(nèi)容拷貝,淺拷貝就是指針拷貝欠雌。本質(zhì)區(qū)別在于:
是否開啟新的內(nèi)存地址
是否影響內(nèi)存地址的引用計(jì)數(shù)
- (void) mutableNSStringTest
{
NSMutableString *mstr1 = [NSMutableString stringWithString:@"test002"];
NSMutableString *mstr2 = [mstr1 copy];
//copy返回的是不可變對象蹄梢,mstr2不能被修改,因此會(huì)發(fā)生崩潰
//[str2 appendString:@"test"];
NSMutableString *mstr3 = [mstr1 mutableCopy];
[mstr3 appendString:@"modify"];
NSLog(@"mstr1:%p - %@ \r\n",mstr1,mstr1);
NSLog(@"mstr2:%p - %@ \r\n",mstr2,mstr2);
NSLog(@"mstr3:%p - %@ \r\n",mstr3,mstr3);
}
分析:mstr1富俄、mstr2禁炒、mstr3 地址都不同,NSMutableString對象copy與mutableCopy都是深拷貝蛙酪,且copy返回的對象是不可變對象齐苛。
No1:可變對象的copy和mutableCopy方法都是深拷貝(區(qū)別完全深拷貝與單層深拷貝) 翘盖。
No2:不可變對象的copy方法是淺拷貝桂塞,mutableCopy方法是深拷貝。
No3:copy方法返回的對象都是不可變對象馍驯。
image.png