內存管理是指軟件運行時對計算機內存資源的分配和使用技術,其最重要的目的是如何高效、快速的分配,并且在適當的時候釋放和回收內存資源。
iOS中數據是存在堆和棧中的,然而我們的內存管理管理的堆上的內存,棧上的內存并不是我們管理
assign:用于對基本數據類型進行賦值操作,不更改引用計數。也可以用來修飾對象,但是,被assign修飾的對象在釋放后,指針的地址還是存在的,也就是說指針并沒有被置為nil,成為野指針。如果后續(xù)在分配對象到堆上的某塊內存時,正好分到這塊地址,程序就會crash。之所以可以修飾基本數據類型,因為基本數據類型一般分配在棧上,棧的內存會由系統(tǒng)自動處理,不會造成野指針。
簡單賦值,不更改索引計數(Reference Counting)。?
weak:修飾Object類型,修飾的對象在釋放后,指針地址會被置為nil,是一種弱引用。在ARC環(huán)境下,為避免循環(huán)引用,往往會把delegate屬性用weak修飾;在MRC下使用assign修飾。weak和strong不同的是:當一個對象不再有strong類型的指針指向它的時候,它就會被釋放,即使還有weak型指針指向它,那么這些weak型指針也將被清除。
ARC下的strong等同于MRC下的retain都會把對象引用計數加1。
copy:會在內存里拷貝一份對象,兩個指針指向不同的內存地址。一般用來修飾NSString等有對應可變類型的對象,因為他們有可能和對應的可變類型(NSMutableString)之間進行賦值操作,為確??勺儗ο笞兓瘯r,對象中的字符串不被修改 ,應該在設置屬性時拷貝一份。而若用strong修飾,如果可變對象變化,對象中的字符串屬性也會跟著變化。
建立一個索引計數為1的對象,然后釋放舊對象?
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1?
nonatomic關鍵字:?
atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統(tǒng)資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
assign和weak的區(qū)別:
共同點:
1.都是弱引用,不增加引用計數
2.都可以作用于對象
不同點:
1.assign即可作用于對象也可以作用于基本數據類型(int等,weak修飾基本數據類型會報錯)
2.weak不會產生野指針,因為weak修飾的對象釋放后(引用計數為0),指針會被系統(tǒng)置為nil,之后再向該對象發(fā)生消息也不會崩潰;
assign則會產生野指針,如果修飾的是對象,當修飾的對象被釋放后,指針不會自動置空,此時向該對象發(fā)送消息則會崩潰