--NSArray與NSMutableArray用copy修飾仍是strong(轉)

1、NSMutableArray 被copy、strong修飾後的變化:segmentfault

把NSMutableArray用copy修飾有時就會crash,由於對這個數組進行了增刪改操做,而copy後的數組變成了不可變數組NSArray,沒有響應的增刪改方法,因此對其進行增刪改操做就會報錯。數組

舉例以下:xcode

(1)copy:測試

 

 

@property (nonatomic, copy  ) NSMutableArray *a;atom

    NSMutableArray* b = [NSMutableArray array];spa

    a = b;.net

 

等同於code

 

 

@property (nonatomic, strong) NSMutableArray *a;對象

    NSMutableArray* b = [NSMutableArray array];blog

    a = [b copy];

a 被copy後就成了NSArray了。

(2)strong:

若是是strong,直接是賦值a = b;右邊是什麼,左邊就是什麼,而且是強引用新值,左邊的類型會與右邊的相同,不會改變。


爲了驗證以上說法,代碼測試以後以下圖:

由圖可看到,當源對象爲可變的時候,最後打印aArray的類型是NSArray,而bArray的類型是NSMutableArray;而且最後在對兩個數組分別作刪除操做的時候,bArray所在的代碼行能夠經過,aArray所在的代碼行則crash了。


 

當源對象爲不可變的時候,最後獲得的aArray和bArray都是不可變的。aArray是不可變的緣由是被copy,bArray是不可變的緣由是源對象爲不可變,與源對象保持一致。而且在對bArray進行刪除操做的時候就crash了。

 

2、NSArray 被copy、strong修飾後的變化:

(1)strong:

被strong修飾以後,因爲只是強引用,因此副本對象數組和源對象數組只是指向同一個內存區域,這樣就會形成副本對象數組會隨着源對象數組的改變而改變,即使有時候你並不想讓副本對象跟着改變。

(2)copy:

 被copy修飾以後,源對象數組被copy了一份,源對象數組和副本對象數組是不一樣的,因此副本對象數組並不會隨着源對象數組改變。

代碼驗證以下:

 

[objc]  view plain  copy
 
  1. @property (nonatomic, strong) NSArray        *array;  

 

[objc]  view plain  copy
 
  1. NSMutableArray *mutableArray = [NSMutableArray array];  
  2.       
  3.     [mutableArray addObject:@"1"];  
  4.       
  5.     self.array = [NSArray array];  
  6.     self.array = mutableArray;  
  7.       
  8.     NSLog(@"array---%@",self.array);  
  9.       
  10.     [mutableArray addObject:@"2"];  
  11.       
  12.     NSLog(@"array---%@",self.array);  

 

 

打印結果以下:由圖可知array隨着mutableArray變化了。

 

把array換成copy修飾的以後,打印結果如圖:可見此次array並無隨着mutableArray改變。

 

 

綜上所述:

當修飾可變類型的屬性時,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。

當修飾不可變類型的屬性時,如NSArray、NSDictionary、NSString,用copy。

相關文章
相關標籤/搜索