各位大神,如果我的文章,很榮幸被您瀏覽到,如有寫的不對的地方,盡管開口,但不要開粗口,謝謝。好吧,我們開始吧。
一、屬性關(guān)鍵字分3類,原子性,引用計(jì)數(shù),讀寫權(quán)限;
1.原子性:
·atomic:線程安全,開銷大,影響性能,一般不用;
·nonatomic:常用,可以用代碼,保證線程的安全;
2.引用計(jì)數(shù):
·assign?非指針變量,一般用于基礎(chǔ)類型對象和C數(shù)據(jù)類型,這些都不是對象,由系統(tǒng)棧進(jìn)行內(nèi)存管理; (id類型的delegate屬性到底是用assign還是weak?答案是weak,據(jù)說是weak比assign多了一個(gè),當(dāng)所指對象銷毀時(shí),自動(dòng)置為nil,這樣再給weak修飾的屬性發(fā)送消息就不會(huì)crash)
·weak?對對象的弱引用,不增加對象的引用計(jì)數(shù),也不持有該對象,當(dāng)對象消失了,指針自動(dòng)置為nil,從而避免野指針。
·strong?對對象的強(qiáng)引用,增加對象的引用計(jì)數(shù),持有該對象,如果指向的對象為空,會(huì)造成野指針;某些情況下,使用strong,也會(huì)造成循環(huán)引用,造成內(nèi)存泄露;但是我們最常用的還是strong。
·copy?會(huì)創(chuàng)建一個(gè)引用計(jì)數(shù)為1的新對象,但并不持有該對象,只是在復(fù)制的時(shí)候?qū)ο蟮闹祻?fù)制給該屬性,使用copy關(guān)鍵字的對象必須要實(shí)現(xiàn)NSCopying協(xié)議。?
·unsafe-unretained?跟weak類似,都是弱引用,當(dāng)所指對象的引用計(jì)數(shù)為0,即銷毀時(shí),指針不會(huì)自動(dòng)置為nil。所以,會(huì)導(dǎo)致程序崩潰,現(xiàn)在一般都會(huì)使用weak。
3.讀寫權(quán)限:
readwrite: 可讀可寫,默認(rèn)
readonly: 只可讀,當(dāng)屬性可以被外界看到,但是卻不想被外界修改;
二、根據(jù)代碼分析:weak和strong
?·聲明2個(gè)屬性
@property (nonatomic, strong) id strongObj;
?@property (nonatomic, weak) id weakObj;
·測試代碼
_strongObj = [NSObject new];
?_weakObj = _strongObj;
NSLog(@"strongObj=%@, weakObj=%@", _strongObj, _weakObj);
?打印結(jié)果?> strongObj=<NSObject: 0x604000005cc0>, weakObj=<NSObject: 0x604000005cc0>
假如我們給測試代碼改為:
_strongObj = [NSObject new];
?_weakObj = _strongObj;
?_strongObj = nil; // 置為nil?
NSLog(@"strongObj=%@, weakObj=%@", _strongObj, _weakObj);?
打印結(jié)果:?strongObj=(null), weakObj=(null)
由以上兩個(gè)打印結(jié)果可以看出,weak為弱引用,并沒有真正的持有該對象,也沒有對該引用計(jì)數(shù)產(chǎn)生影響,當(dāng)所指的對象不存在時(shí),weak指針就自動(dòng)置為nil。
再次修改測試代碼,來分析分析strong
id obj = [NSObject new];
?_strongObj = obj;?
_weakObj = _strongObj;
obj = nil;?
NSLog(@"strongObj=%@, weakObj=%@, obj=%@", _strongObj, _weakObj,obj);?
打印結(jié)果:?strongObj=<NSObject:>, weakObj=<NSObject:>, obj=(null)
可以看到,雖然給obj置為nil的時(shí)候,strong屬性和weak修飾的屬性都可以打印出結(jié)果,由此可說明,strong對對象強(qiáng)引用,并導(dǎo)致引用計(jì)數(shù)+1,所以,只有再把_strongObj = nil,該對象的引用計(jì)數(shù)才會(huì)變?yōu)?,?_strongObjc=null,_weakObj=null;
·根據(jù)代碼分析:copy,以及在聲明block屬性的時(shí)候?yàn)槭裁匆欢ㄒ胏opy
id obj = [NSObject new];?
_copOBJ = obj;?
NSLog(@"copyObj=%@", _copObj);?
obj = [NSObject new];
?NSLog(@"copyObj=%@", _copObj);?
打印結(jié)果:
?copyObj=<NSObject:>
copyObj=<NSObject:>
由此看出,原對象雖然更改了,但是并未影響copy修飾的屬性,即深拷貝。
block經(jīng)常使用copy關(guān)鍵字?原因:見下次詳解

注意:NSMutableString、NSMutableArray、NSMutableDictionary,使用copy應(yīng)注意 原因:添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?yīng)的方法而崩潰.因?yàn)閏opy就是復(fù)制一個(gè)不可變NSArray的對象;