iOS NSString聲明字符串是何時用copy,strong

簡單理解:

copy會在內(nèi)存中從新開辟一個空間去存儲他,指針會指向一個新的地址。

strong不會在內(nèi)存中開辟新空間,會把當(dāng)前字符串指針也指向之前的地址。

下面舉個例子:

@property(retain,nonatomic)NSString *rStr;

@property(copy,nonatomic)NSString *cStr;

- (void)test:

{

NSMutableString*mStr = [NSMutableString stringWithFormat:@"abc"];

self.rStr= mStr;

self.cStr= mStr;

如果現(xiàn)在改變mStr的值:

[mStr appendString:@"de"];

NSLog(@"retainStr:%@",_rStr);

NSLog(@"copyStr:%@",_cStr);

結(jié)果,

使用retain的字串rStr的值:@"abcde",

而使用copy的字串cStr的值:@"abc",

所以,如果一般情況下,我們都不希望字串的值跟著mStr變化,所以我們一般用copy來設(shè)置string的屬性。

如果希望字串的值跟著賦值的字串的值變化,可以使用strong,retain。

注意:上面的情況是針對于當(dāng)把NSMutableString賦值給NSString的時候,才會有不同,如果是賦值是NSString對象,那么使用copy還是strong,結(jié)果都是一樣的,因?yàn)镹SString對象根本就不能改變自身的值,他是不可變的。

把一個對象賦值給一個屬性變量,當(dāng)這個對象變化了,如果希望屬性變量變化就使用strong屬性,如果希望屬性變量不跟著變化,就是用copy屬性。

由此可以看出:

對源頭是NSMutableString的字符串,retain僅僅是指針引用,增加了引用計(jì)數(shù)器,這樣源頭改變的時候,用這種retain方式聲明的變量(無論被賦值的變量是可變的還是不可變的),它也會跟著改變;而copy聲明的變量,它不會跟著源頭改變,它實(shí)際上是深拷貝。

對源頭是NSString的字符串,無論是retain聲明的變量還是copy聲明的變量,當(dāng)?shù)诙卧搭^的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實(shí)二者都是指針引用,也就是淺拷貝。

另外說明一下,這兩者對內(nèi)存計(jì)數(shù)的影響都是一樣的,都會增加內(nèi)存引用計(jì)數(shù),都需要在最后的時候做處理。

其實(shí)說白了,對字符串為啥要用這兩種方式?我覺得還是一個安全問題,比如聲明的一個NSString *str變量,然后把一個NSMutableString *mStr變量的賦值給它了,如果要求str跟著mStr變化,那么就用retain;如果str不能跟著mStr一起變化,那就用copy。而對于要把NSString類型的字符串賦值給str,那兩都沒啥區(qū)別。不會影響安全性,內(nèi)存管理也一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容