iOS開發(fā)屬性關(guān)鍵字總結(jié)

各位大神,如果我的文章,很榮幸被您瀏覽到,如有寫的不對的地方,盡管開口,但不要開粗口,謝謝。好吧,我們開始吧。

一、屬性關(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的對象;

參考文獻(xiàn):?參考文獻(xiàn)?參考文獻(xiàn):參考文獻(xiàn)

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

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

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