assign:用于對基本數(shù)據(jù)類型進(jìn)行賦值操作缩幸,不更改引用計(jì)數(shù)壹置。也可以用來修飾對象,但是表谊,被assign修飾的對象在釋放后钞护,指針的地址還是存在的,也就是說指針并沒有被置為nil铃肯,成為野指針患亿。如果后續(xù)在分配對象到堆上的某塊內(nèi)存時(shí),正好分到這塊地址押逼,程序就會(huì)crash步藕。之所以可以修飾基本數(shù)據(jù)類型,因?yàn)榛緮?shù)據(jù)類型一般分配在棧上挑格,棧的內(nèi)存會(huì)由系統(tǒng)自動(dòng)處理咙冗,不會(huì)造成野指針。
weak:修飾Object類型漂彤,修飾的對象在釋放后雾消,指針地址會(huì)被置為nil,是一種弱引用挫望。
delegate為何要用weak修飾:
- 在ARC環(huán)境下立润,為避免循環(huán)引用,往往會(huì)把delegate屬性用weak修飾媳板;在MRC下使用assign修飾桑腮。
weak和strong不同的是:當(dāng)一個(gè)對象不再有strong類型的指針指向它的時(shí)候,它就會(huì)被釋放蛉幸,即使還有weak型指針指向它破讨,那么這些weak型指針也將被清除。
ARC下的strong等同于MRC下的retain都會(huì)把對象引用計(jì)數(shù)加1奕纫。
copy
- copy:會(huì)在內(nèi)存里拷貝一份對象提陶,兩個(gè)指針指向不同的內(nèi)存地址。一般用來修飾NSString等有對應(yīng)可變類型的對象匹层,因?yàn)樗麄冇锌赡芎蛯?yīng)的可變類型(NSMutableString)之間進(jìn)行賦值操作隙笆,為確保對象中的字符串不被修改 ,應(yīng)該在設(shè)置屬性是拷貝一份又固。而若用strong修飾仲器,如果對象在外部被修改了,會(huì)影響到屬性仰冠。
block屬性為什么需要用copy來修飾乏冀?
- 因?yàn)樵贛RC下,block在創(chuàng)建的時(shí)候洋只,它的內(nèi)存是分配在棧(stack)上的辆沦,而不是在堆(heap)上昼捍,可能被隨時(shí)回收。他本身的作于域是屬于創(chuàng)建時(shí)候的作用域肢扯,一旦在創(chuàng)建時(shí)候的作用域外面調(diào)用block將導(dǎo)致程序崩潰妒茬。通過copy可以把block拷貝(copy)到堆,保證block的聲明域外使用蔚晨。在ARC下寫不寫都行乍钻,編譯器會(huì)自動(dòng)對block進(jìn)行copy操作。
__block與__weak的區(qū)別
__block:在ARC和MRC下都可用铭腕,可修飾對象银择,也可以修飾基本數(shù)據(jù)類型。
__block對象可以在block被重新賦值累舷,__weak不可以浩考。
__weak:只在ARC中使用,只能修飾對象被盈,不能修飾基本數(shù)據(jù)類型(int析孽、bool)。
同時(shí)只怎,在ARC下袜瞬,要避免block出現(xiàn)循環(huán)引用,經(jīng)常會(huì):__weak typedof(self) weakSelf = self;