為什麼NSString要用Copy來修飾

2021-07-22 02:01:40 字數 1227 閱讀 3790

關於nsstring要用copy來修飾這個問題,我不多說只是擺出**:

// 深複製

person

* xiaoming = [[

person

alloc

]init];

nsmutablestring

* name = [[

nsmutablestring

alloc

]initwithstring

:@"xiaoming"];

//    name.string = @"xiaoming";

xiaoming.

name

= name;

nslog

(@"%@"

, xiaoming.

name);

[name

:@"hah"];

// 此時名字這個屬性被修改了

nslog

(@"%@"

, xiaoming.

name);

如果用copy來修飾name這個屬性不會改變,如果使用strong,當name這個字串改變的時候,name這個屬性也會隨著改變。

xiaoming.name = name;(此時name是用copy修飾的)    等同於  xiaoming.name = [name copy];(copy對可變物件進行的是深拷貝,此時是拷貝出了乙個新的物件然後賦值給了xiaoming.name   mutablecopy對所有的物件進行的都是深拷貝)

補充:這其實也是看需求,看被賦值的字串是否需要隨著賦值字串的變化而變化,而大多數情況下我們不希望被賦值的字串如某個物件的某個字串型別的屬性會隨著賦值字串的變化而變化。  反之,如果我們希望被賦值的字串隨著賦值字串的變化而變化,那麼我們也可以使用strong來修飾字串(賦值字串和被賦值字串說的好像挺繞口啊)。注:賦值字串既然可變,那它就必然是可變字串。

至於其底層原理區別則是兩種修飾方式讓指標指向的記憶體位址不同。使用copy修飾被賦值字串,被修飾字串會對賦值字串(可變字串)進行一次深拷貝,那麼被賦值字串和賦值字串指向的是完全不同的兩塊記憶體位址,反之兩者指向的同一塊記憶體位址。

當我們確定賦值字串是不可變字串的時候我們是可以使用strong來修飾字串。

聯想:由copy修飾字串想到的用strong修飾陣列,原理是一樣的,當我們用strong來修飾不可變陣列的時候,如果賦值陣列是可變陣列,那麼被賦值陣列同樣會隨著可變陣列的變化而變化。

為什麼要用 enable shared from

樓主 hma if you think you can,you can.panrainbow 憂鬱淡藍 於 tue nov 9 11 48 38 2010 提到 引入enable shared from this的原因是可以實現返回值為指向該類本身的 shared ptr,為什麼以this為拷貝構造...

為什麼要用補碼

在探求為何機器要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念.對於乙個數,計算機要使用一定的編碼方式進行儲存.原碼,反碼,補碼是機器儲存乙個具體數字的編碼方式.原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 原 1000 ...

為什麼要用AndroidStudio

原因一 android studio是基於intellij idea開發的,所以android studio繼承了intellij idea的所有功能.原因二 android studio是谷歌開發的,專門用於android開發的編輯器,換句話說是親兒子,谷歌會把所有好吃的好用的先給親兒子.原因三 ...