在iOS開發(fā)中,我們通常通過聲明屬性(@property)來擺脫繁瑣的setter和getter方法的創(chuàng)建了赵。
Objective-C中的屬性有三個(gè)特征:
1.聲明了set和get方法
2.實(shí)現(xiàn)了set和get方法
3.聲明了一個(gè)同名的帶下劃線的成員變量
讀寫控制
readonly
表示只讀,也就是只會(huì)生成get方法.
readwrite
表示可讀可寫,默認(rèn)是readwrite,表示既可以賦值,也可以被賦值.
注
讀寫控制中是沒有writeonly的,因?yàn)閷懭氲那疤峋褪亲x取
原子性控制
atomic
原子性:默認(rèn)為atomic,他保證了程序在運(yùn)行期間,不會(huì)出現(xiàn)某一條線程還沒有執(zhí)行完set方法,另一條就執(zhí)行的情況發(fā)生,就相當(dāng)于在函數(shù)的開頭家了一條同步鎖,這樣會(huì)保證線程的安全,但是由于只能有一條線程訪問,效率就大大降低了.
nonatomic
非原子性:多條線程并發(fā)執(zhí)行,效率相對(duì)原子性atomic高很多,但是原子性的控制需要和@synthesize,@dynamic配和使用才有意義.
@synthesize
如果不實(shí)現(xiàn)setter和getter方法,將按照編譯器的規(guī)則自動(dòng)生成setter和getter方法.
@dynamic
直接或動(dòng)態(tài)的執(zhí)行setter和getter方法.通常自己實(shí)現(xiàn)setter和getter方法,我們基本上不會(huì)用到.
內(nèi)存管理控制
OC中的內(nèi)存管理機(jī)制是由引用計(jì)數(shù)(retainCount)來控制的,當(dāng)RC=0的時(shí)候系統(tǒng)就會(huì)回收這些對(duì)象占用的內(nèi)存.但是在有些情況下我們并不希望內(nèi)存的回收是由某些對(duì)象是否引用來控制的,而是在它應(yīng)該銷毀的時(shí)候銷毀.
retain
retain是強(qiáng)引用,使用retain引用的對(duì)象RC會(huì)加1.
那么什么時(shí)候使用強(qiáng)引用呢?
1.當(dāng)數(shù)據(jù)類型是OC中的對(duì)象時(shí)(也就是它存在于內(nèi)存中的堆區(qū))
2.當(dāng)需要保證內(nèi)存不會(huì)被意外回收的時(shí)候使用強(qiáng)引用,可以確保持有安全
assign
與強(qiáng)引用對(duì)應(yīng)的就是弱引用,使用弱引用所引用的對(duì)象RC并不會(huì)加1,這就實(shí)現(xiàn)了我們上面說的"但是在有些情況下我們并不希望內(nèi)存的回收是由某些對(duì)象是否引用來控制的,而是在它應(yīng)該銷毀的時(shí)候銷毀."
assign修飾的屬性不會(huì)操作任何一塊內(nèi)存空間,所以一般用于修飾基本數(shù)據(jù)類型,系統(tǒng)為基本數(shù)據(jù)類型開辟內(nèi)存空間,優(yōu)先存放在棧區(qū).這樣我們也就不必?fù)?dān)心它會(huì)被意外釋放了
copy
copy分為淺copy和深copy.
1.淺拷貝
淺拷貝拷貝的是指向這塊內(nèi)存的指針,內(nèi)存并沒有開辟新的空間,只是拷貝了一個(gè)指向原內(nèi)存空間的指針而已,使用淺拷貝RC也會(huì)加1,注意這個(gè)1是加在了指針指向的對(duì)象(也就是原對(duì)象)上面了.
2.深拷貝
深拷貝是將對(duì)象完整的拷貝了一份,放在了一個(gè)新的內(nèi)存空間中,引用計(jì)數(shù)RC同樣會(huì)加1.注意這個(gè)1是加在了新的對(duì)象上面了.
注:
向一個(gè)可變對(duì)象方copy和mutableCopy,永遠(yuǎn)都是深拷貝
向一個(gè)不可變對(duì)象,發(fā)送copy是淺拷貝,mutableCopy是深拷貝
strong
ARC(Automatic Reference Counting)是iOS 5推出的新功能,簡單地說,就是代碼中自動(dòng)加入了retain和release,原先需要手動(dòng)添加的用來處理內(nèi)存管理的引用計(jì)數(shù)的代碼可以自動(dòng)地由編譯器完成了恐仑。
ARC環(huán)境下,引入了strong來代替retain表示強(qiáng)引用,簡單的理解他是等同于retain的.
weak
ARC環(huán)境下,引入了weak代替assign表示弱引用,但是weak與assign是有不同的.
assign修飾的對(duì)象在使用結(jié)束之后,并不會(huì)把指向這個(gè)對(duì)象內(nèi)存的指針
置為nil,對(duì)象已經(jīng)被釋放了,但是指針還是會(huì)指向這塊內(nèi)存,這樣就會(huì)造成內(nèi)存泄露.但是weak就很好的解決了這個(gè)問題,當(dāng)使用weak修飾的對(duì)象被釋放之后,指向這個(gè)對(duì)象內(nèi)存空間的直至接著就會(huì)被置為nil,指向內(nèi)存的起始位置,回收空間,內(nèi)存清零.
Last
以上就是OC中修飾屬性的幾個(gè)關(guān)鍵字.