NSMutableArray 被copy、strong修飾后的變化


一、NSMutableArray 被copy、strong修飾后的變化:

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

舉例如下:

(1)copy:

 

 

@property (nonatomic, copy  ) NSMutableArray *a;

    NSMutableArray* b = [NSMutableArray array];

    a = b;

 

等同於

 

 

@property (nonatomic, strong) NSMutableArray *a;

    NSMutableArray* b = [NSMutableArray array];

    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了。

 

二、NSArray 被copy、strong修飾后的變化:

(1)strong:

被strong修飾之后,由於只是強引用,所以副本對象數組和源對象數組只是指向同一個內存區域,這樣就會造成副本對象數組會隨着源對象數組的改變而改變,即便有時候你並不想讓副本對象跟着改變。

(2)copy:

 被copy修飾之后,源對象數組被copy了一份,源對象數組和副本對象數組是不同的,所以副本對象數組並不會隨着源對象數組改變。

代碼驗證如下:

 

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

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM