天天看點

Objective-c中對象的Copy、MutableCopy、淺拷貝、深拷貝

對象的複制就是複制一個對象作為副本,他會開辟一塊新的記憶體(堆記憶體)來存儲副本對象,就像複制檔案一樣,即源對象和副本對象是兩塊不同的記憶體區域。對象要具備複制功能,必須實作<NSCopying>協定或者<NSMutableCopying>協定,常用的可複制對象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary

copy:産生對象的副本是不可變的

mutableCopy:産生的對象的副本是可變的

淺拷貝和深拷貝

      淺拷貝值複制對象本身,對象裡的屬性、包含的對象不做複制

      深拷貝則既複制對象本身,對象的屬性也會複制一份

Foundation中支援複制的類,預設是淺複制

對象的自定義拷貝

    對象擁有複制特性,須實作NSCopying,NSMutableCopying協定,實作該協定的CopyWithZone:方法或MutableCopyWithZone:方法。

淺拷貝實作

-(id)copyWithZone:(NSZone *)zone{
            
            Person *person = [[[self Class]allocWithZone:zone]init];
            p.name = _name;
            p.age = _age;
            return person;
        }
           

深拷貝的實作

-(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的 是一個可變對象時,複本不可變