C語言 中的深/淺拷貝
淺拷貝
簡單點說淺拷貝就是對內存地址的復制,讓目標對象指針和源對象指針指向同一片內存空間。如:
char *str = (char *)malloc(100);
char *str2 = str;
上述例子就是淺拷貝最好的實例,淺拷貝就是簡單的拷貝地址,讓幾個對象共同指向同一塊內存。當內存銷毀時,指向該內存的其他指針需重新指向,否則將成為野指針
深拷貝
深拷貝就是拷貝地址中的內容,讓目標對象產生新的內存區(qū)域,且將源內存區(qū)域中的內容復制到目標內存區(qū)域中
char *str = (char *)malloc(20);
strcpy(str, "hello world");
//復制
char *str2 = (char *)malloc(20);
strcpy(str2, str);
深拷貝就是產生一個新的對象,將源對象的所有內容拷貝到新的對象中,新對象和源對象各自指向自己的內存區(qū)域,相互之間不受影響。
iOS中的深/淺拷貝
iOS中其實可以把類看做兩部分,一部分是類本身的空間 一部分是屬性所指向的空間,如下圖:

對于淺拷貝,只是新創(chuàng)建了類的空間,然后將屬性的值復制一遍;對于屬性所指向的內存空間并沒有重新創(chuàng)建;因此通過淺拷貝的新舊兩個對象的屬性其實還是指向一塊相同的內存空間。
而深拷貝,不僅僅新創(chuàng)建了類的空間,還新創(chuàng)建了每一個屬性對應的空間,所以深拷貝也稱為完全拷貝;通過深拷貝得來的新對象和舊對象,兩個對象的屬性都是指向各自的內存空間,不再共享空間。
自定義類的深拷貝和淺拷貝
在OC中要想自定義的類具有拷貝功能(也就是能用copy方法)則類必須遵守NSCopying協(xié)議,并且實現協(xié)議中的(id)copyWithZone:(NSZone *)zone方法;
在這個方法中我們可以根據自己的實際情況來實現,不同的實現方式,copy出來的對象具有不同的效果
類的深/淺拷貝也就是在這個方法中體現,具體如下
淺拷貝方法的實現
-(id)copyWithZone:(NSZone *)zone
{
//創(chuàng)建新的對象空間
Student *stu = [[self class] allocWithZone:zone];
//將屬性復制---其實只是復制了地址
stu.name = self.name;
stu.sex = self.sex;
stu.age = self.age;
return stu;
}
深拷貝方法的實現
-(id)copyWithZone:(NSZone *)zone
{
//創(chuàng)建新的對象空間
Student *stu = [[self class] allocWithZone:zone];
//為每個屬性創(chuàng)建新的空間,并將內容復制
stu.name = [[NSString alloc] initWithString:self.name];
stu.sex = [[NSString alloc] initWithString:self.sex];
stu.age = self.age;
return stu;
}
偽拷貝方法的實現
其實對于-(id)copyWithZone:(NSZone *)zone方法的實現還有第三種,我們把他叫做偽拷貝,具體實現如下:
-(id)copyWithZone:(NSZone *)zone
{
//拷貝自己本身地址
return [self retain];
}
使用中的深拷貝和淺拷貝
在我們的使用中自定義類實現的方式不一樣,拷貝出來的效果也不一樣,同樣一段代碼,深拷貝和淺拷貝的最終效果如下:
Student *s1 = [[Student alloc] init];
s1.name = @"tanyufeng";
s1.sex = @"男";
Student *s2 = [s1 copy];
偽拷貝的效果

淺拷貝的效果

深拷貝的效果

歡迎大家踴躍評論,讓我們一起探討技術!!
如果覺得文章不錯,請幫忙點擊文章下方的喜歡??!
你的支持將是對我最好的鼓勵, 謝謝!??!