當(dāng)copy修飾的String屬性賦值時的對象是一個不可變對象的時候, 不會發(fā)生內(nèi)存的拷貝行為, 只是發(fā)生了指針的強(qiáng)引用(指針重新指向);
當(dāng)copy修飾的String屬性賦值的對象是一個可變對象的時候才會發(fā)生內(nèi)存的拷貝;
用strong修飾NSString:對象屬性和源字符串公用了一塊內(nèi)存,源字符串的引用計(jì)數(shù)+1;
為什么日常開發(fā)NSString屬性用copy修飾:
例如用一個可變字符串A給用copy修飾的屬性B賦值則A再次拼接改變的時候, B的值不會變,因?yàn)閏opy出來一塊新的內(nèi)存區(qū)域; 而用strong修飾的時候A改變時B也會跟著改變,因?yàn)閟trong強(qiáng)行引用指針,是同一塊內(nèi)存區(qū)域
為什么日常開發(fā)NSMutableString屬性用strong修飾:
用copy修飾的時候其實(shí)拷貝出來的一塊內(nèi)存區(qū)域是不可變, 用一個可變字符串給他賦值, 然后拼接這個屬性時就會崩潰, 用strong修飾的時候就不會出現(xiàn)這種情況, 因?yàn)閟trong修飾后是指針強(qiáng)引用, 始終指向的同一塊內(nèi)存區(qū)域
為什么日常開發(fā)NSArray屬性用copy修飾:
如果用strong修飾的話,用一個可變數(shù)組給他賦值,然后可變數(shù)組改變后,這個NSArray內(nèi)容也會跟著改變,這明顯有違背NSArray原則, 但是用copy修飾的話這時用可變數(shù)組給其賦值,相當(dāng)于是重新拷貝了一份內(nèi)存區(qū)域;
為什么日常開發(fā)NSMutableArray屬性用strong修飾:
類似于NSMutableString的問題,如果用copy修飾這個數(shù)組,相當(dāng)于copy了一份不可邊的內(nèi)存區(qū)域, 你對他更改的時候就會crash