NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
假如,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。
希望可以幫到妳。