1. 什么情況使用 weak 關(guān)鍵字诀浪,相比 assign 有什么不同棋返?
什么情況使用 weak 關(guān)鍵字?
1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用weak來(lái)解決,比如: delegate代理
屬性
2)自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用weak雷猪,自定義IBOutlet控件
屬性一般也使用weak睛竣;當(dāng)然,也可以使用strong求摇。
在下文也有論述:《IBOutlet連出來(lái)的視圖屬性為什么可以被設(shè)置成weak?》
不同點(diǎn):
1)weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”
(nonowning relationship)射沟。為這種屬性設(shè)置新值時(shí)殊者,設(shè)置方法既不保留新值,也不釋放舊值验夯。
此特質(zhì)同assign類(lèi)似猖吴, 然而在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)挥转。 而 assign 的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類(lèi)型” (scalar type海蔽,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作。
2)assigin 可以用非OC對(duì)象,而weak必須用于OC對(duì)象
2. 怎么用 copy 關(guān)鍵字绑谣?
用途:
1)NSString党窜、NSArray、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字借宵,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類(lèi)型:NSMutableString幌衣、NSMutableArray、NSMutableDictionary壤玫;
2)block也經(jīng)常使用copy關(guān)鍵字泼掠,具體原因見(jiàn)官方文檔:Objects Use Properties to Keep Track of Blocks:
block使用copy是從MRC遺留下來(lái)的“傳統(tǒng)”,在MRC中垦细,方法內(nèi)部的block是在棧區(qū)的,使用copy可以把它放到堆區(qū)挡逼,在ARC中寫(xiě)不寫(xiě)都行括改; 對(duì)于block使用copy還是strong效果是一樣的,但寫(xiě)上copy也無(wú)傷大雅家坎,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì)block進(jìn)行了copy操作嘱能。
- copy和strong的區(qū)別?
下面做下解釋?zhuān)?/strong> copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類(lèi)似虱疏。然而設(shè)置方法并不保留新值惹骂,而是將其“拷貝” (copy)。 當(dāng)屬性類(lèi)型為NSString時(shí)做瞪,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性对粪,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類(lèi)的實(shí)例。這個(gè)類(lèi)是NSString的子類(lèi)装蓬,表示一種可修改其值的字符串著拭,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后牍帚,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改儡遮。所以,這時(shí)就要拷貝一份“不可變” (immutable)的字符串暗赶,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)鄙币。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable)肃叶,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。
為了理解這種做法十嘿,首先要知道因惭,對(duì)非集合類(lèi)對(duì)象的copy操作:
在非集合類(lèi)對(duì)象中:對(duì)immutable對(duì)象進(jìn)行copy操作,是指針復(fù)制详幽,mutableCopy操作時(shí)內(nèi)容復(fù)制筛欢;對(duì)mutable對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制。
- 用代碼簡(jiǎn)單表示如下:
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //深復(fù)制
[mutableObject copy] //深復(fù)制
[mutableObject mutableCopy] //深復(fù)制
用@property聲明 NSString唇聘、NSArray版姑、NSDictionary 經(jīng)常使用copy關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類(lèi)型:NSMutableString迟郎、NSMutableArray剥险、NSMutableDictionary,他們之間可能進(jìn)行賦值操作宪肖,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)表制,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。
** ## 一句話總結(jié):使用‘copy’關(guān)鍵詞防止屬性的值被修改控乾。##**
3. 用@property聲明的NSString(或NSArray么介,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么蜕衡?如果改用strong關(guān)鍵字壤短,可能造成什么問(wèn)題?
1)因?yàn)楦割?lèi)指針可以指向子類(lèi)對(duì)象,使用copy的目的是為了讓本對(duì)象的屬性不受外界影響,使用copy無(wú)論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.
2)如果我們使用是strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性慨仿。copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類(lèi)似久脯。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)镰吆。 當(dāng)屬性類(lèi)型為NSString時(shí)帘撰,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性。