iOS內(nèi)存管理(6)--NSArray與NSMutableArray用copy修飾還是strong

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

測(cè)試圖片.png

二、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變化了。

圖片.png

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

圖片.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容