assign與weak
兩者都是弱引用,
assign通常用于普通類(lèi)型屬性(如int,NSInteger)邦马,
assign簡(jiǎn)單賦值,只進(jìn)行值釋放宴卖。這就導(dǎo)致野指針存在滋将,即當(dāng)這塊地址還沒(méi)寫(xiě)上其他值前,能輸出正常值症昏,但一旦重新寫(xiě)上數(shù)據(jù)随闽,該指針隨時(shí)可能沒(méi)有值,造成崩潰肝谭。
weak用于修飾OC對(duì)象橱脸,兩者都不更改索引計(jì)數(shù)(Reference Counting)
只是后者比前者多了一個(gè)功能,后者會(huì)在引用的對(duì)象被釋放的時(shí)候?qū)⒃搶傩灾脼閚il分苇,而前者依然會(huì)指向原來(lái)的位置,這樣就會(huì)變成野指針屁桑。在oc中你給你一個(gè)nil對(duì)象發(fā)送消息不會(huì)crash医寿,但是給一個(gè)對(duì)象發(fā)送他不能解析的消息是會(huì)crash的,所以總的來(lái)說(shuō)weak要比assign安全一些蘑斧。像delegate屬性建議用weak修飾而不是assign靖秩。
weak和strong不同的是 當(dāng)一個(gè)對(duì)象不再有strong類(lèi)型的指針指向它的時(shí)候 它會(huì)被釋放 ,即使還有weak型指針指向它竖瘾。一旦最后一個(gè)strong型指針離去 沟突,這個(gè)對(duì)象將被釋放,所有剩余的weak型指針都將被清除捕传。
strong和retain
聲明屬性時(shí)用strong或者retain效果是一樣的惠拭,都是強(qiáng)引用,除了某些情況下不一樣,其他的時(shí)候也是可以通用的职辅。?
不過(guò)在聲明Block時(shí)棒呛,使用strong和retain會(huì)有截然不同的效果。strong會(huì)等于copy域携,而retain竟然等于assign簇秒!strong在修飾block的時(shí)候就相當(dāng)于copy,而retain修飾block的時(shí)候就相當(dāng)于assign秀鞭,這樣block會(huì)出現(xiàn)提前被釋放掉的危險(xiǎn)趋观。
當(dāng)然定義Block還是應(yīng)該用copy(還有其他需要注意的地方,可以參考這篇文章:iOS: ARC和非ARC下使用Block屬性的問(wèn)題)锋边,因?yàn)榉茿RC下不copy的Block會(huì)在棧中皱坛,ARC中的Block都會(huì)在堆上的。
copy會(huì)重新開(kāi)辟新的內(nèi)存來(lái)保存一份相同的數(shù)據(jù)宠默。被賦值對(duì)象和原值修改互不影響麸恍。
strong和weak賦值都指向原來(lái)數(shù)據(jù)地址,區(qū)別是前者會(huì)對(duì)數(shù)據(jù)地址進(jìn)行引用計(jì)數(shù)+1搀矫,后者不會(huì)
retain:自動(dòng)幫我們生成getter/setter方法抹沪,并且生成的是內(nèi)存管理代碼(引用計(jì)數(shù)器+1)。 assign:不會(huì)自動(dòng)幫助我們?cè)趕etter/getter方法中生成內(nèi)存管理代碼瓤球,僅僅生成普通的?