iOS 基礎知識專題1 —— copy、mutableCopy

copy and mutableCopy

接下來會按照專題的方式,寫一些 iOS 基礎基礎知識的文章,有些是從電腦裏之前的筆記摘出來的。本片文章是關於copy、mutableCopy的總結。安全

先看如下幾段代碼:atom

  1. 對 NSString 作 copy、mutableCopy:code

    NSString *str1 = @"123";
    NSString *copyStr1 = [str1 copy];
    NSMutableString *mutableStr1 = [str1 mutableCopy];
    
    NSLog(@"%p",str1);           // 0x108159088
    NSLog(@"%p",copyStr1);       // 0x108159088
    NSLog(@"%p",mutableStr1);    // 0x60c00024d050

    結論:對 NSString 作 copy 獲得的對象地址不變,作mutableCopy,地址會變對象

  2. 對 MutableString 作 copy、mutableCopy:string

    // NSMutableString
    NSMutableString *str2 = [NSMutableString stringWithString:@"123"];
    NSString *copyStr2 = [str2 copy];
    NSMutableString *mutableStr2 = [str2 mutableCopy];
    
    NSLog(@"%p",str2);           // 0x60c000245670
    NSLog(@"%p",copyStr2);       // 0xa000000003332313
    NSLog(@"%p",mutableStr2);    // 0x60c000245940

    結論:對 NSMutableString 作 copy、mutableCopy地址都會變。it

  3. 對 NSArray 作 copy、mutableCopy:table

    // NSArray
    NSArray *array1 = [NSArray arrayWithObject:@"1"];
    NSArray *copyArray1 = [array1 copy];
    NSMutableArray *mutableCopyArray1 = [array1 mutableCopy];
    
    NSLog(@"%p",array1);                // 0x60c000015de0
    NSLog(@"%p",copyArray1);            // 0x60c000015de0
    NSLog(@"%p",mutableCopyArray1);     // 0x60c0000567a0

    結論:對 NSArray 作 copy 獲得的對象地址不變,作mutableCopy,地址會變,和String狀況同樣class

  4. 對 NSMutableArray 作 copy、mutableCopy:基礎

    // NSMutableArray
    NSMutableArray *array2 = [NSMutableArray arrayWithObject:@"1"];
    NSArray *copyArray2 = [array2 copy];
    NSMutableArray *mutableCopyArray2 = [array2 mutableCopy];
    
    NSLog(@"%p",array2);                // 0x604000255390
    NSLog(@"%p",copyArray2);            // 0x60400001c2d0
    NSLog(@"%p",mutableCopyArray2);     // 0x604000255210

    結論:對 NSMutableArray 作 copy、mutableCopy地址都會變。總結

總結一下:

  1. copy 返回不可變對象,對於「不可變對象「作 copy,地址不變。對於」可變對象「作 copy,地址改變(必定是兩個不一樣對象,可變不可變能力都變了)。
  2. mutableCopy返回可變對象,不管對」可變對象「仍是」不可變對象「,作 mutableCopy,地址都會改變。
  3. 也正說明了,爲何一個屬性定義成copy的時候,比較安全,由於賦值的時候,至關於加上了 [XXX copy] 好比 @property (nonatomic, copy) NSString *m_string; 因此若是賦值過來的是一個可變對象,也就是對可變對象作copy,會新生成一個對象賦值給 m_string,那麼即便本來的可變對象改變了,也不影響 m_string 的變化。
X copy mutableCopy
可變對象 地址不變 地址改變
不可變對象 地址改變 地址改變
相關文章
相關標籤/搜索