天天看點

oc80--copy

//
//  main.m
//  Copy基本使用,拷貝的本質:修改其中一個不能影響另外一個。

//  每個oc對象都有copy和mutableCopy方法,前提是必須遵守NSCopying協定實作copyWithZone方法和NSMutableCopying協定實作mutableCopyWithZone方法。

//  copy出來的對象是不可變的(NSString,NSArray,NSDictionary),NSMutableString調用copy方法出來的是NSString,mutableCopy出來的對象是可變的(NSMutableString,NSMutableArray,NSMutableDictionary).NSString調用mutableCopy方法出來的是NSMutableString。

//  oc大部分對象都遵循了NSCopying和NSMutableCopying協定,自定義對象是沒有copy和mutableCopy方法的。
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

     // 會生成一個新的對象
    NSString *srcStr1 = @"lnj";
    // 隻要是拷貝出來的對象, 拷貝出來的對象中的内容和以前對象中的内容一緻
    // "一般"情況下拷貝會生成一個新的對象
    // 為什麼會産生一個新的對象 1.因為拷貝要求修改原來的對象不能影響到拷貝出來得對象 \
                              修改拷貝出來的對象也不能影響到原來的對象, 是以需要生成一個新的對象 \
                            2.由于以前的對象是一個不可變的對象, 而通過mutableCopy拷貝出來的對象必須是一個可變的對象, 是以必須生成一個新的對象
    
    NSMutableString *copyStr1 = [srcStr1 mutableCopy];
    NSLog(@"srcStr = %@, copyStr = %@", srcStr1, copyStr1);
    NSLog(@"srcStr = %p, copyStr = %p", srcStr1, copyStr1);//srcStr = 0x100004238, copyStr = 0x100700090
    
    
    
    //  會生成一個新的對象
    NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lnj"];
    NSMutableString *copyStr2 = [srcStr2 mutableCopy];
    
    [srcStr2 appendString:@" cool"];
    NSLog(@"srcStr = %@, copyStr = %@", srcStr2, copyStr2);
    NSLog(@"srcStr = %p, copyStr = %p", srcStr2, copyStr2);//srcStr = 0x100300560, copyStr = 0x100202780
    
    

     //  會生成一個新的對象
    NSMutableString *srcStr3 = [NSMutableString stringWithFormat:@"lnj"];
    NSString *copyStr3 = [srcStr3 copy];
    [srcStr3 appendString:@" cool"];
    NSLog(@"srcStr = %@, copyStr = %@", srcStr3, copyStr3);
    NSLog(@"srcStr = %p, copyStr = %p", srcStr3, copyStr3);//srcStr = 0x100204aa0, copyStr = 0x6a6e6c35
    
    
    //不生成新的對象
    // 如果是通過不可變對象調用了copy方法, 那麼不會生成一個新的對象(2個都是不可變的,那麼可以公用一個算了,隻要有一個是可變的,那麼修改一個就會影響另外一個,是以不能指向同一個記憶體空間)。
    // 原因: 因為原來的對象是不能修改的, 拷貝出來的對象也是不能修改的,既然兩個都不能修改, 是以永遠不能影響到另外一個對象, 那麼已經符合需求,是以: OC為了對記憶體進行優化, 就不會生成一個新的對象
    NSString *srcStr = @"lnj";
    NSString *copyStr = [srcStr copy];
    NSLog(@"srcStr = %p, copyStr = %p", srcStr, copyStr);//srcStr = 0x100004238, copyStr = 0x100004238
    
    /*
     正是因為調用copy方法有時候會生成一個新的對象, 有時候不會生成一個新的對象
     是以: 如果沒有生成新的對象, 我們稱之為淺拷貝, 本質就是指針拷貝
          如果生成了新的對象, 我們稱之為深拷貝, 本質就是會建立一個新的對象
     */
    return 0;
}