1. 程式人生 > >修飾屬性使用Copy與使用Strong的區別?

修飾屬性使用Copy與使用Strong的區別?

NSString使用Copy與使用Strong屬性的區別?
宣告一個不可變的字串物件,不管是Strong還是Copy屬性的物件,指向的地址都是同一個原來String指向的地址。
如在MRC環境,輸出String的引用計數,會看到其引用計數值是3,即Strong操作和Copy操作都會使原字串物件的引用計數值加1。

NSMutableString使用Copy與使用Strong屬性的區別?
宣告一個可變的字串物件,此時Copy屬性字串已不再指向原來的String物件,而是開闢了新地址並複製了String字串的值,且copy修飾的String物件指向這個字串。
在MRC環境下,輸出兩者的引用計數,可以看到String物件的引用計數是2,而copy的String物件的引用計數是1。
如果去修改String字串的話,可以看到:因為strong修飾的String與原始String是指向同一物件,所以strong修飾的String的值也會跟隨著改變(此時strong修飾的String的型別實際上是NSMutableString,而不是NSString);而用copy修飾的String是指向另一個物件,並不會改變。

結論:
我們知道NSMutableString是NSString的子類,一個NSString指標可以指向NSMutableString物件,strong修飾的String指標指向一個可變字串是正常的。

  1. 當原字串是NSString時,字串是不可變的,不管是Strong還是Copy屬性的物件,都是指向原物件,Copy操作只是做了次淺拷貝。
  2. 當原字串是NSMutableString時,Strong屬性只是增加了原字串的引用計數,而Copy屬性則是對原字串做了次深拷貝,產生一個新的物件,且Copy屬性物件指向這個新的物件,且這個Copy屬性物件的型別始終是NSString,而不是NSMutableString,因此其是不可變的。
  3. 這裡還有一個性能問題,即在原字串是NSMutableString,Strong是單純的增加物件的引用計數,而Copy操作是執行了一次深拷貝,所以效能上會有所差異(雖然不大)。如果原字串是NSString時,則沒有這個問題。
    所以,在宣告NSString屬性時,到底是選擇strong還是copy,可以根據實際情況來定。不過,一般我們將物件宣告為NSString時,都不希望它改變,所以大多數情況下,我們建議用copy,以免因可變字串的修改導致的一些非預期問題。