從NSString學(xué)習(xí)copy等關(guān)鍵字

先從NSString的copy和strong分析


這里引入對(duì)象的深復(fù)制,以及淺復(fù)制:前者是再開(kāi)辟一個(gè)新的內(nèi)存空間存儲(chǔ)復(fù)制的對(duì)象,內(nèi)容一樣但是地址不一樣;后者是復(fù)制對(duì)象的指針,所以地址是一樣內(nèi)容肯定也是一樣。

NSString的實(shí)例均可以使用copy、mutablecopy方法,但是NSMutableString只能使用mutablecopy方法。這里面的copy方法就是淺復(fù)制,而如果使用mutablecopy就是使用深復(fù)制。

再說(shuō)回使用copy等關(guān)鍵字定義一個(gè)NSString或者NSMutableString對(duì)象。一般情況下:
1 nonatomic:對(duì)象非原子性,一般在線程安全的要求下使用保證線程安全。
2 copy和retain:這里就好比上面說(shuō)的深復(fù)制和淺復(fù)制。使用copy定義一個(gè)實(shí)例的時(shí)候,就是重新開(kāi)辟一個(gè)內(nèi)存空間存儲(chǔ)。但是如果是retain就僅僅是復(fù)制實(shí)例的指針,因此如果不在arc下編程,可以查看到實(shí)例的retaincount會(huì)+1;除此之后

@property (retain,nonatomic) NSString *rStr;  
@property (copy, nonatomic)   NSString *cStr;
- (void)test:
{
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
self.rStr   = mStr;
self.cStr     = mStr;
[mStr appendString:@"de"];
NSLog(@"retainStr:%@",  _rStr);
NSLog(@"copyStr:%@",    _cStr);
}

結(jié)果:
使用retain的字串rStr的值:@"abcde",
而使用copy的字串cStr的值:@"abc",
所以,如果一般情況下,我們都不希望字串的值跟著mStr變化,所以我們一般用copy來(lái)設(shè)置string的屬性。
如果希望字串的值跟著賦值的字串的值變化,可以使用strong,retain。

3 copy和strong:在復(fù)制NSSring的情況下,copy和strong的情況是一樣的。只有在復(fù)制NSMutableString的時(shí)候,strong跟retain差不多,就像是mrc下的retain,copy就是深復(fù)制。

貼幾個(gè)大神的實(shí)驗(yàn)代碼:
NSString特性分析學(xué)習(xí)
知識(shí)點(diǎn)總結(jié)
iOS5 ARC學(xué)習(xí)筆記

Attention

NSLog(@"test = %@, a_adr = %p,a_pointer",a,a,&a);

哎_ c沒(méi)學(xué)好,潛意識(shí)認(rèn)識(shí)&a是a實(shí)例的地址,想想才發(fā)現(xiàn)是指向a的指針的地址!??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容