iOS記憶體管理的問題總結

2021-08-01 17:10:16 字數 1766 閱讀 2833

這幾個關鍵字在宣告變數的時候經常遇到,那麼它們有什麼區別,應該如何選擇呢?

這些關鍵字的主要區別,在於對記憶體的管理。

首先,要介紹一下objective-c的記憶體管理機制。objective-c對記憶體的管理,以一種叫做「retain count」的方式來管理。對於乙個物件,當它被new/alloc/retain的時候,它的retain count會加1;當它被release的時候,它的retain count會減1;當它的retain count達到0的時候,就表示沒有其它物件再引用它,這時候編譯器會自動呼叫其dealloc方法,銷毀掉這個物件。

另外,對於乙個物件,其它物件引用它的方式,有2種方式,一種叫強引用,這個時候retain count會加1;另一種叫弱引用,這個時候retain count不變;這就產生一種結果:對於乙個物件a,如果a的強引用都被釋放掉了,即使還有其它的弱引用,a的retain count還是會變成0,也就是被銷毀掉。這也就是弱引用的「弱」所在。

有了以上2個概念,就可以區分出以上關鍵字的區別了。

在mrr(即手動管理記憶體)階段,retain表示強引用,assign表示弱引用。用retain修飾的物件,賦值的時候會呼叫一次retain,將物件的retain count加1;而assign修飾的物件,則直接賦值,retain count不變;

對於int/float等原生的資料型別,可以使用assign;而對於其它需要在多個地方使用的物件,需要用到retain;

ios5的時候,蘋果推出了乙個新特性,arc,這個特性的好處就是編譯器會在適當的時候自動新增retain/release/autorelease語句,就避免了人工管理這些**。簡單的理解,strong就是arc中的retain,而weak就是arc階段的assign;

weak和assign很像,它們的區別主要在於:當weak物件指向的記憶體被釋放掉後,它會自動被置為nil,避免了crash;而assign指標在這種情況下會變成野指標,比較危險。

copy關鍵字比較複雜。在對於不可變型別時,它會和strong一樣,拷貝指標;而對於可變型別時,它就會將內容拷貝乙份,並指向新的內容。比如:對於nsstring,copy的結果和strong一樣;而對於nsmutablestring,copy就會複製乙份出來。

從以上copy的表現來看,可以看出,拷貝的情況有2種:一種是拷貝指標,而指向同一塊記憶體,這種拷貝叫淺拷貝;另外一種,則是將記憶體拷貝乙份,然後指向新的記憶體,這種拷貝叫深拷貝

強引用會出現一種導致記憶體洩漏的結果:retain cycle。簡單來說,就是a強引用了b,而b也強引用了a。這個時候,a等著b釋放a,b也等著a釋放b,就會導致a和b都無法釋放掉,就造成了記憶體洩漏。這種情況會在以下情況發生:

父類/子類之間;

使用delegate的時候;

**塊block中。block本身是乙個強引用,而且它會建立變數的快照,即強引用處於block裡面的變數,這也會導致retain cycle;

如何避免?

對於1和3,可以通過weak關鍵字,將其中乙個引用轉成弱引用,這樣就打破了retain cycle;

對於2,一般用」__weak」來修飾。很多時候是使用乙個weak的self,來防止self類和block形成retain cycle。

注意:uiview的animation block不會導致retain cycle,因為self並沒有引用這個block。

最後,對於記憶體洩漏,如何除錯呢?可以用instruments裡的leak工具來除錯,比較方便。

iOS 記憶體管理總結

一 自動釋放池 自動釋放池,任何標記為自動釋放並因此新增到池中的物件,將在池本身被釋放的同時也自動釋放,程式可以有多個自動釋放池,它們還可以是巢狀的。如果程式在執行時將產生大量的臨時物件,就可能需要在程式中建立多重自動釋放池。例如 for inti 0 i 1000000 i 在執行此段 的時候會有...

ios記憶體管理總結

1.在init函式中必須呼叫 super init 函式dealloc中必須呼叫 super dealloc 2.呼叫以 alloc new copy mutablecopy 開頭函式的生成的物件,必須release 3.物件呼叫retain,必須release 4.物件可以呼叫autoreleas...

iOS記憶體管理小總結

1 引用計數機制通過可以遞增遞減的計數器來管理 記憶體。物件建立好之後,其保留計數至少為1。若保留計數為正,則物件繼續存活。當保留計數降為0時,物件就被銷毀了 2 在物件生命週期中,其餘物件通過引用來保留或者釋放此物件。保留與釋放操作分別會遞增及遞減保留計數 3 使用arc一定要記住,引用計數實際上...