1.weak關(guān)鍵字與assign
1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性,block
2)自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用weak,自定義IBOutlet控件屬性一般也使用weak孔轴;當(dāng)然剃法,也可以使用strong
3)assign是指針賦值,不對(duì)引用計(jì)數(shù)操作路鹰,使用之后如果沒有置為nil贷洲,可能就會(huì)產(chǎn)生野指針;而weak一旦不進(jìn)行使用后晋柱,永遠(yuǎn)不會(huì)使用了优构,就不會(huì)產(chǎn)生野指針!防止循環(huán)引用,weak不用后就會(huì)置為nil雁竞。
4)weak內(nèi)部原理:Runtime維護(hù)了一個(gè)Weak表钦椭,用于存儲(chǔ)指向某個(gè)對(duì)象的所有Weak指針。Weak表其實(shí)是一個(gè)哈希表碑诉,Key是所指對(duì)象的地址彪腔,Value是Weak指針的地址(這個(gè)地址的值是所指對(duì)象的地址)的數(shù)組。
5)assigin?可以用非OC對(duì)象,而weak必須用于OC對(duì)象
2.copy關(guān)鍵字
1)NSString进栽、NSArray德挣、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString快毛、NSMutableArray格嗅、NSMutableDictionary;
2)block也經(jīng)常使用copy關(guān)鍵字唠帝,具體原因見官方文檔:Objects Use Properties to Keep Track of Blocks:
block使用copy是從MRC遺留下來的“傳統(tǒng)”,在MRC中,方法內(nèi)部的block是在棧區(qū)的,使用copy可以把它放到堆區(qū).在ARC中寫不寫都行:對(duì)于block使用copy還是strong效果是一樣的屯掖,但寫上copy也無傷大雅,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì)block進(jìn)行了copy操作襟衰。下面做下解釋: copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似贴铜。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)瀑晒。 當(dāng)屬性類型為NSString時(shí)阀湿,經(jīng)常用此特質(zhì)來保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例瑰妄。這個(gè)類是NSString的子類陷嘴,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串间坐,那么設(shè)置完屬性之后灾挨,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改邑退。所以,這時(shí)就要拷貝一份“不可變” (immutable)的字符串劳澄,確保對(duì)象中的字符串值不會(huì)無意間變動(dòng)地技。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份秒拔。
用@property聲明 NSString莫矗、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字砂缩,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString作谚、NSMutableArray、NSMutableDictionary庵芭,他們之間可能進(jìn)行賦值操作妹懒,為確保對(duì)象中的字符串值不會(huì)無意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份双吆。
3.@property (copy) NSMutableArray *array;有問題么?
兩個(gè)問題:
1眨唬、添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰.因?yàn)閏opy就是復(fù)制一個(gè)不可變NSArray的對(duì)象;
2好乐、使用了atomic屬性會(huì)嚴(yán)重影響性能匾竿。
第1條的相關(guān)原因在下文中有論述《用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字蔚万,為什么岭妖?如果改用strong關(guān)鍵字,可能造成什么問題笛坦?》 以及上文《怎么用 copy 關(guān)鍵字区转?》也有論述苔巨。
第2條原因版扩,如下:
該屬性使用了同步鎖,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫多線程程序侄泽,這會(huì)帶來性能問題礁芦,通過聲明nonatomic可以節(jié)省這些雖然很小但是不必要額外開銷。
在默認(rèn)情況下悼尾,由編譯器所合成的方法會(huì)通過鎖定機(jī)制確保其原子性(atomicity)柿扣。如果屬性具備nonatomic特質(zhì),則不使用同步鎖闺魏。請(qǐng)注意未状,盡管沒有名為“atomic”的特質(zhì)(如果某屬性不具備nonatomic特質(zhì),那它就是“原子的”(atomic))析桥。
在iOS開發(fā)中司草,你會(huì)發(fā)現(xiàn)艰垂,幾乎所有屬性都聲明為nonatomic。
一般情況下并不要求屬性必須是“原子的”埋虹,因?yàn)檫@并不能保證“線程安全” ( thread safety)猜憎,若要實(shí)現(xiàn)“線程安全”的操作,還需采用更為深層的鎖定機(jī)制才行搔课。例如胰柑,一個(gè)線程在連續(xù)多次讀取某屬性值的過程中有別的線程在同時(shí)改寫該值,那么即便將屬性聲明為atomic爬泥,也還是會(huì)讀到不同的屬性值柬讨。
4.strong&retain
聲明屬性時(shí)用strong或者retain效果是一樣的(貌似更多開發(fā)者更傾向于用strong)。不過在聲明Block時(shí)急灭,使用strong和retain會(huì)有截然不同的效果姐浮。strong會(huì)等于copy,而retain竟然等于assign葬馋!因?yàn)榉茿RC下不copy的Block會(huì)在棧中卖鲤,ARC中的Block都會(huì)在堆上的
未完待續(xù)!