1.assign與weak,它們都是弱引用聲明類型,最大的區(qū)別在哪呢?
(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。
2.assign:
用于基礎(chǔ)數(shù)據(jù)類型(例如NSInteger等)和C數(shù)據(jù)類型(int,float,double,char)等,另外還有id類型。
不同點(diǎn):
(1).weak,表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值,也不釋放舊值。
(2).assign也可以修飾對(duì)象,但是用assign修飾的對(duì)象在釋放后,指針的地址還是存在的,也就是說(shuō)指針并沒(méi)有被置為nil,會(huì)造成眾所周知的野指針異常。然而,assign修飾的基礎(chǔ)數(shù)據(jù)類型(例如NSInteger等)和C數(shù)據(jù)類型(int,float,double,char)等一般分配在棧空間上,棧空間的內(nèi)存會(huì)由系統(tǒng)自動(dòng)處理,當(dāng)分配的棧空間的內(nèi)存沒(méi)有被指針指向時(shí)就會(huì)被銷毀,所以不會(huì)造成野指針異常。
(3).weak比 assign多了一個(gè)功能就是當(dāng)屬性所指向的對(duì)象消失的時(shí)候(也就是內(nèi)存引用計(jì)數(shù)為0)會(huì)自動(dòng)賦值為 nil,這樣再向 weak修飾的屬性發(fā)送消息就不會(huì)導(dǎo)致野指針操作crash。
如果用weak聲明的變量在棧中就會(huì)自動(dòng)清空,賦值為nil。
ios中assign、copy 、retain、strong、weak的區(qū)別
強(qiáng)引用了和弱引用的區(qū)別
強(qiáng)引用引用計(jì)數(shù)器+1
弱引用引用計(jì)數(shù)器不變
如果用assign聲明的變量在棧中可能不會(huì)自動(dòng)賦值為nil,就會(huì)造成野指針錯(cuò)誤!
堆和棧的區(qū)別可以用如下的比喻來(lái)看出:
使用棧就象我們?nèi)ワ堭^里吃飯,只管點(diǎn)菜(發(fā)出申請(qǐng))、付錢、和吃(使用),吃飽了就走,不必理會(huì)切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動(dòng)手做喜歡吃的菜肴,比較麻煩,吃完之后還得清洗、打掃等后續(xù)工作(不然用完了不清洗就不好再用),但是比較符合自己的口味,而且自由度大。