一、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了。
測試圖片.png
二、NSArray 被copy、strong修飾后的變化:
(1)strong:
被strong修飾之后,由于只是強引用,所以副本對象數組和源對象數組只是指向同一個內存區域,這樣就會造成副本對象數組會隨著源對象數組的改變而改變,即便有時候你并不想讓副本對象跟著改變。
(2)copy:
被copy修飾之后,源對象數組被copy了一份,源對象數組和副本對象數組是不同的,所以副本對象數組并不會隨著源對象數組改變。
代碼驗證如下:
@property (nonatomic, strong) NSArray *array;
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"1"];
self.array = [NSArray array];
self.array = mutableArray;
NSLog(@"array---%@", self.array);
[mutableArray addObject:@"2"];
NSLog(@"array---%@", self.array);
打印結果如下:由圖可知array隨著mutableArray變化了。
圖片.png
把array換成copy修飾的之后,打印結果如圖:可見這次array并沒有隨著mutableArray改變。
圖片.png
綜上所述:
當修飾可變類型的屬性時,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
當修飾不可變類型的屬性時,如NSArray、NSDictionary、NSString,用copy。