你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> NSString什麼時候用copy,什麼時候用strong

NSString什麼時候用copy,什麼時候用strong

編輯:IOS開發綜合

大部分的時候NSString的屬性都是copy,那copy與strong的情況下到底有什麼區別呢?

 


比如:


@property (retain,nonatomic) NSString *rStr;

@property (copy, nonatomic)   NSString *cStr;

 

- (void)test:

{


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

    self.rStr   = mStr;
    self.cStr     = mStr;

    NSLog(@"mStr:%p,%p",  mStr,&mStr);

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

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

假如,mStr對象的地址為0x11,也就是0x11是@“abc”的首地址,mStr變量自身在內存中的地址為0x123;

當把mStr賦值給retain的rStr時,rStr對象的地址為0x11,rStr變量自身在內存中的地址為0x124;rStr與mStr指向同樣的地址,他們指向的是同一個對象@“abc”,這個對象的地址為0x11,所以他們的值是一樣的。

當把mStr賦值給copy的cStr時,cStr對象的地址為0x22,cStr變量自身在內存中的地址0x125;cStr與mStr指向的地址是不一樣的,他們指向的是不同的對象,所以copy是深復制,一個新的對象,這個對象的地址為0x22,值為@“abc”。

 


如果現在改變mStr的值:


    [mStr appendString:@"de"];


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

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


結果,
使用retain的字串rStr的值:@"abcde",
而使用copy的字串cStr的值:@"abc",
所以,如果一般情況下,我們都不希望字串的值跟著mStr變化,所以我們一般用copy來設置string的屬性。
如果希望字串的值跟著賦值的字串的值變化,可以使用strong,retain。
注意:上面的情況是針對於當把NSMutableString賦值給NSString的時候,才會有不同,如果是賦值是NSString對象,那麼使用copy還是strong,結果都是一樣的,因為NSString對象根本就不能改變自身的值,他是不可變的。


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

 


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

對源頭是NSString的字符串,無論是retain聲明的變量還是copy聲明的變量,當第二次源頭的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。

另外說明一下,這兩者對內存計數的影響都是一樣的,都會增加內存引用計數,都需要在最後的時候做處理。

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

 


 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved