目錄
- assign
- weak
- strong
- copy
序言
在iOS開發(fā)中定義@property屬性時,經(jīng)常用到assign、weak、strong、copy等關(guān)鍵字。我們經(jīng)常會考慮在何時應(yīng)該使用哪個關(guān)鍵字,尤其是在面試的時候,經(jīng)常會被問到這些關(guān)鍵字之間的區(qū)別。
1.首先我們需要明確,對象的內(nèi)存一般被分配到堆上,基本數(shù)據(jù)類型和OC數(shù)據(jù)類型一本被分配在棧上。
2.棧上內(nèi)存由系統(tǒng)分配和釋放,堆上內(nèi)存由程序員手動釋放
一 assign
用于對基本數(shù)據(jù)類型進行賦值操作,不更改引用計數(shù)。也可以用來修飾對象。
1.1 使用assign修飾基本數(shù)據(jù)類型
assign修飾基本數(shù)據(jù)類型或OC數(shù)據(jù)類型,因為基本數(shù)據(jù)類型是分配在棧上的,由系統(tǒng)分配和釋放,所以不會造成野指針。
1.2 使用assign修飾對象
如果用assign修飾對象,當對象釋放后(因為不存在強引用,離開作用域?qū)ο髢?nèi)存可能被回收),指針的地址還是存在的,也就是說指針并沒有被置為nil,下次再訪問該對象就會造成野指針異常。對象是分配在堆上的,堆上的內(nèi)存由程序員手動釋放。
二 weak
修飾Object類型,修飾的對象在釋放后,指針地址會被置為nil,是一種弱引用。
2.1 delegate為何要用weak修飾
在ARC環(huán)境下,為避免循環(huán)引用,往往會把delegate屬性用weak修飾;在MRC下使用assign修飾。
三 strong
強引用指針
ARC下的strong等同于MRC下的retain都會把對象引用計數(shù)加1。
weak和strong不同的是:當一個對象不再有strong類型的指針指向它的時候,它就會被釋放,即使還有weak型指針指向它,那么這些weak型指針也將被清除。
四 copy
會在內(nèi)存里拷貝一份對象,兩個指針指向不同的內(nèi)存地址。一般用來修飾NSString等有對應(yīng)可變類型的對象,因為他們有可能和對應(yīng)的可變類型(NSMutableString)之間進行賦值操作,為確保對象中的字符串不被修改 ,應(yīng)該在設(shè)置屬性是拷貝一份。而若用strong修飾,如果對象在外部被修改了,會影響到屬性。
4.1 block屬性為什么需要用copy來修飾?
因為在MRC下,block在創(chuàng)建的時候,它的內(nèi)存是分配在棧(stack)上的,而不是在堆(heap)上,可能被隨時回收。他本身的作于域是屬于創(chuàng)建時候的作用域,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導致程序崩潰。通過copy可以把block拷貝(copy)到堆,保證block的聲明域外使用。在ARC下寫不寫都行,編譯器會自動對block進行copy操作。
4.2 __block與__weak的區(qū)別
-
__block:在ARC和MRC下都可用,可修飾對象,也可以修飾基本數(shù)據(jù)類型。 -
__block對象可以在block被重新賦值,__weak不可以。 -
__weak:只在ARC中使用,只能修飾對象,不能修飾基本數(shù)據(jù)類型(int、bool)
在ARC下,要避免block出現(xiàn)循環(huán)引用,經(jīng)常會:__weak typedof(self) weakSelf = self;