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