先從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的指針的地址!??!