1.assign與weak阳堕,它們都是弱引用聲明類型木羹,最大的區(qū)別在哪呢好渠?
(1).在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性脱拼。
(2).如果自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用文虏,沒有必要再強(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ì)象在釋放后弛作,指針的地址還是存在的涕蜂,也就是說指針并沒有被置為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)存沒有被指針指向時(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ū)別可以用如下的比喻來看出:
使用棧就象我們?nèi)ワ堭^里吃飯验庙,只管點(diǎn)菜(發(fā)出申請(qǐng))顶吮、付錢、和吃(使用)粪薛,吃飽了就走悴了,不必理會(huì)切菜、洗菜等準(zhǔn)備工作和洗碗违寿、刷鍋等掃尾工作湃交,他的好處是快捷,但是自由度小藤巢。
使用堆就象是自己動(dòng)手做喜歡吃的菜肴巡揍,比較麻煩,吃完之后還得清洗菌瘪、打掃等后續(xù)工作(不然用完了不清洗就不好再用)腮敌,但是比較符合自己的口味,而且自由度大俏扩。