@property是什么
@Property是聲明屬性的語(yǔ)法,它可以快速方便的為實(shí)例變量創(chuàng)建存取器昌腰,并允許我們通過(guò)點(diǎn)語(yǔ)法使用存取器。
存取器(accessor):指用于獲取和設(shè)置實(shí)例變量的方法棒口。用于獲取實(shí)例變量值的存取器是getter尚猿,用于設(shè)置實(shí)例變量值的存取器是setter信姓。
@property 后面可以有哪些修飾符
@property有10種屬性修飾符可分為三大類阁谆。
一.原子性
1.atomic(默認(rèn)):
a.atomic意為操作是原子的往核,意味著只有一個(gè)線程訪問(wèn)實(shí)例變量蜂奸。
b.atomic是線程安全的犁苏,至少在當(dāng)前的存取器上是安全的。
c.因?yàn)楸容^影響效率扩所,在非ARC編譯環(huán)境下围详,需要設(shè)置訪問(wèn)鎖來(lái)保證對(duì)該變量進(jìn)行正確的get/set,所以不常用祖屏。
2.nonatomic:
a.nonatomic跟atomic剛好相反助赞。表示非原子的,可以被多個(gè)線程訪問(wèn)赐劣。
b.它是非線程安全型嫉拐,訪問(wèn)速度快。
c.但不能保證在多線程環(huán)境下的安全性魁兼,當(dāng)兩個(gè)不同的線程對(duì)其訪問(wèn)時(shí)婉徘,容易失控。
總結(jié):atomic和nonatomic用來(lái)決定編譯器生成的getter和setter是否為原子操作咐汞。在多線程環(huán)境下盖呼,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果化撕。加了atomic几晤,setter函數(shù)會(huì)變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
二.存取器控制
3.readwrite(默認(rèn)):readwrite是默認(rèn)值,表示該屬性同時(shí)擁有setter和getter植阴。
4.readonly: readonly表示只有g(shù)etter沒(méi)有setter蟹瘾。
三. 內(nèi)存管理
5.assign(默認(rèn)):
a.簡(jiǎn)單賦值圾浅,不更改索引計(jì)數(shù)。
假設(shè)你用malloc分配了一塊內(nèi)存憾朴,并且把它的地址賦值給了指針a狸捕,后來(lái)你希望指針b也共享這塊內(nèi)存,于是你又把a(bǔ)賦值給(assign)了b众雷。此時(shí)a 和b指向同一塊內(nèi)存灸拍,請(qǐng)問(wèn)當(dāng)a不再需要這塊內(nèi)存,能否直接釋放它砾省?答案是否定的鸡岗,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了编兄,那么b在使用這塊內(nèi)存的時(shí)候會(huì)引起程序crash掉轩性。
b.適用簡(jiǎn)單數(shù)據(jù)類型,如int翻诉、float炮姨、double和NSInteger,CGFloat等表示單純的復(fù)制碰煌。還包括不存在所有權(quán)關(guān)系的對(duì)象舒岸,比如常見(jiàn)的delegate。
- copy
用于非共享內(nèi)存時(shí)芦圾,每個(gè)指針有自己的內(nèi)存空間蛾派。也就是說(shuō)實(shí)例變量是對(duì)傳入對(duì)象的副本擁有所有權(quán),而非對(duì)象本身个少。故修改copy的變量洪乍,對(duì)其他變無(wú)影響。
7.strong
a.ARC中默認(rèn)屬性夜焦,等于非ARC中的retain
b.實(shí)例變量對(duì)傳入的對(duì)象要有所有權(quán)關(guān)系壳澳,即強(qiáng)引用。strong跟retain的意思相同并產(chǎn)生相同的代碼茫经,但是語(yǔ)意上更好更能體現(xiàn)對(duì)象的關(guān)系巷波。
舉個(gè)例子,當(dāng)我們把指向一只風(fēng)箏的變量聲明為strong時(shí)卸伞,此時(shí)抹镊,你就擁有控制這只風(fēng)箏的線,假如此時(shí)有五個(gè)人同時(shí)控制這只風(fēng)箏(即這只風(fēng)箏對(duì)象有三個(gè)strong類型的變量指向它)荤傲,那么只有一種情況垮耳,這只風(fēng)箏才會(huì)掙脫掉線的束縛:這三個(gè)人都放掉手中的線,(release掉)
8.weak
a.assign 相對(duì)應(yīng)
b.用于IBOutlets,如,UIViewController的子類终佛,即一般的控件俊嗽。
c.在setter方法中,需要對(duì)傳入的對(duì)象不進(jìn)行引用計(jì)數(shù)加1的操作铃彰。
簡(jiǎn)單來(lái)說(shuō)乌询,就是對(duì)傳入的對(duì)象沒(méi)有所有權(quán),當(dāng)該對(duì)象引用計(jì)數(shù)為0時(shí)豌研,即該對(duì)象被釋放后,用weak聲明的實(shí)例變量指向nil唬党,即實(shí)例變量的值為0鹃共。
繼續(xù)上面的例子,當(dāng)我們把指向一只風(fēng)箏的變量聲明為weak時(shí)驶拱,此時(shí)霜浴,就像站在旁邊看風(fēng)箏的觀眾們一樣,當(dāng)上面的三個(gè)人還握著手中的線時(shí)蓝纲,他們只能看到風(fēng)箏阴孟,并不能控制它,他們能做的只能是用手指指向風(fēng)箏税迷,并大喊永丝,“看,那只風(fēng)箏飛得真高箭养!”慕嚷,然而,當(dāng)上面的三個(gè)人把手中的線都放掉時(shí)毕泌,此時(shí)喝检,風(fēng)箏飛走了,看不見(jiàn)了撼泛,不管有再多的觀眾挠说,他們?cè)僖部床坏斤L(fēng)箏了,這個(gè)故事告訴我們一個(gè)道理:當(dāng)strong類型的指針被釋放掉之后愿题,所有的指向同一個(gè)對(duì)象的weak指針都會(huì)被清零损俭。
9.retain:
a.在setter方法中,需要對(duì)傳入的對(duì)象進(jìn)行引用計(jì)數(shù)加1的操作抠忘。
簡(jiǎn)單來(lái)說(shuō)撩炊,就是對(duì)傳入的對(duì)象擁有所有權(quán),只要對(duì)該對(duì)象擁有所有權(quán)崎脉,該對(duì)象就不會(huì)被釋放拧咳。
b.與strong相對(duì)應(yīng),使用了引用計(jì)數(shù)囚灼,retain+1,release -1;當(dāng)引用 計(jì)數(shù)為0時(shí)骆膝,dealloc會(huì)被調(diào)用祭衩,內(nèi)存被釋放
10.unsafe_unretauined
用在ARC編譯環(huán)境下,在此環(huán)境下阅签,與assign相似掐暮。它只是告訴ARC如何正確地調(diào)用聲明為unsafe_unretauined變量的retain和release
屬性相關(guān)問(wèn)題
1.什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同政钟?
a.在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用 weak 來(lái)解決,比如: delegate 代理屬性
b.自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak路克;當(dāng)然,也可以使用strong养交。
c.weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)精算。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值碎连,也不釋放舊值灰羽。此特質(zhì)同assign類似,然而在屬性所指的對(duì)象遭到摧毀時(shí)鱼辙,屬性值也會(huì)清空(nil out)廉嚼。而 assign 的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類型” (scalar type,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作倒戏。
d.assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象
2.怎么用 copy 關(guān)鍵字怠噪?
這里有一個(gè)鏈接講述的比較深入全面
iOS中關(guān)鍵字copy與mutableCopy的詳解,看我你就都懂了
3.如何讓自己的類用 copy 修飾符峭梳?如何重寫(xiě)帶 copy 關(guān)鍵字的 setter?
繼續(xù)鏈接了:
如何讓自己的類用 copy 修飾符舰绘?如何重寫(xiě)帶 copy 關(guān)鍵字的 setter?