標籤:oc copy oc mutable copy 淺拷貝 深拷貝
對象的複製就是複製一個對象作為副本,他會開闢一塊新的記憶體(堆記憶體)來儲存副本對象,就像複製檔案一樣,即來源物件和副本對象是兩塊不同的記憶體地區。對象要具備複製功能,必須實現<NSCopying>協議或者<NSMutableCopying>協議,常用的可複製對象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary
copy:產生對象的副本是不可變的
mutableCopy:產生的對象的副本是可變的
淺拷貝和深拷貝
淺拷貝值複製對象本身,對象裡的屬性、包含的對象不做複製
深拷貝則既複製對象本身,對象的屬性也會複製一份
Foundation中支援複製的類,預設是淺複製
對象的自訂拷貝
對象擁有複製特性,須實現NSCopying,NSMutableCopying協議,實現該協議的CopyWithZone:方法或MutableCopyWithZone:方法。
淺拷貝實現
[cpp] view plaincopyprint?
- -(id)copyWithZone:(NSZone *)zone{
-
- Person *person = [[[self Class]allocWithZone:zone]init];
- p.name = _name;
- p.age = _age;
- return person;
- }
深拷貝的實現
[cpp] view plaincopyprint?
- -(void)copyWithZone:(NSZone *)zone{
- Person *person = [[[self Class]allocWithZone:zone]init];
- person.name = [_name copy];
- person.age = [_age copy];
- return person;
-
- }
深淺拷貝和retain之間的關係
copy、mutableCopy和retain之間的關係
Foundation中可複製的對象,當我們copy的是一個不可變的對象的時候,它的作用相當與retain(cocoa做的記憶體最佳化)
當我們使用mutableCopy的時候,無論來源物件是否可變,副本是可變的
當我們copy的 是一個可變對象時,複本不可變
Objective-c中對象的Copy、MutableCopy、淺拷貝、深拷貝