一、NSMutableArray 被copy、strong修飾后的變化:
把NSMutableArray用copy修飾有時(shí)就會(huì)crash,因?yàn)閷?duì)這個(gè)數(shù)組進(jìn)行了增刪改操作,而copy后的數(shù)組變成了不可變數(shù)組NSArray,沒(méi)有響應(yīng)的增刪改方法,所以對(duì)其進(jìn)行增刪改操作就會(huì)報(bào)錯(cuò)。
舉例如下:
(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;右邊是什么,左邊就是什么,并且是強(qiáng)引用新值,左邊的類(lèi)型會(huì)與右邊的相同,不會(huì)改變。
為了驗(yàn)證以上說(shuō)法,代碼測(cè)試之后如下圖:
由圖可看到,當(dāng)源對(duì)象為可變的時(shí)候,最后打印aArray的類(lèi)型是NSArray,而bArray的類(lèi)型是NSMutableArray;并且最后在對(duì)兩個(gè)數(shù)組分別做刪除操作的時(shí)候,bArray所在的代碼行可以通過(guò),aArray所在的代碼行則crash了。

二、NSArray 被copy、strong修飾后的變化:
(1)strong:
被strong修飾之后,由于只是強(qiáng)引用,所以副本對(duì)象數(shù)組和源對(duì)象數(shù)組只是指向同一個(gè)內(nèi)存區(qū)域,這樣就會(huì)造成副本對(duì)象數(shù)組會(huì)隨著源對(duì)象數(shù)組的改變而改變,即便有時(shí)候你并不想讓副本對(duì)象跟著改變。
(2)copy:
被copy修飾之后,源對(duì)象數(shù)組被copy了一份,源對(duì)象數(shù)組和副本對(duì)象數(shù)組是不同的,所以副本對(duì)象數(shù)組并不會(huì)隨著源對(duì)象數(shù)組改變。
代碼驗(yàn)證如下:
@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);
打印結(jié)果如下:由圖可知array隨著mutableArray變化了。

把a(bǔ)rray換成copy修飾的之后,打印結(jié)果如圖:可見(jiàn)這次array并沒(méi)有隨著mutableArray改變。

綜上所述:
當(dāng)修飾可變類(lèi)型的屬性時(shí),如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
當(dāng)修飾不可變類(lèi)型的屬性時(shí),如NSArray、NSDictionary、NSString,用copy。