iOS 記憶體管理詳解

2021-07-09 22:40:33 字數 1904 閱讀 6537

在arc下主要有以下幾個關鍵字:

1.關鍵字 __strong 預設值,表示只要有強引用指標指向該變數,則該變數會一直存在。

2.關鍵字__weak 弱引用,表示若沒有任何強引用指標指向該變數,會自動將變數的值置為空,即nil狀態。

3.關鍵字 __autoreleasing 用於標示自動釋放的變數

4.關鍵字__unsafe_unretained 不安全的弱引用,若沒有任何強引用指標指向該變數,不會自動設為空,會成為野指標。

__strong強引用,是arc中變數宣告的預設值,如果是手動分配的堆記憶體,並且沒有指標指向這塊記憶體,那麼這塊記憶體就會被**

1.當宣告變數為強引用時,物件的指標出棧時,如果該指標指向的記憶體空間沒有別的指標指向它,那麼就會自動掉用dealloc方法釋放堆記憶體

2.給物件指標重寫分配記憶體的情況,如果沒有別的指標指向該記憶體空間的話那麼就會隨著物件的指標出棧的時候,釋放這塊記憶體空間

3.把物件指標置為空時,分配的堆記憶體會立即被釋放掉

4.把新的物件指標指向堆記憶體空間,然後把原有的指標進行置空此時這塊記憶體空間不會被釋放,因為有新的指標指向這塊記憶體空間

__weak 歸零弱引用:弱引用指標指向的記憶體被釋放後,弱引用的指標則會置零

1.歸零弱引用:弱引用的指標指向強引用的記憶體時,是不影響其釋放記憶體空間的,當弱引用指標所指空間被釋放的時候,該弱引用指標會被置零。

__autoreleasing 自動釋放,一般結合@autoreleasepool(自動釋放池)使用

1.自動釋放修飾的指標所指向的記憶體空間會在自動釋放池結束的時候會被釋放

2.__autoreleasing結合著自動釋放池會延遲記憶體空間的釋放

//情況2.自動釋放型別和自動釋放池配合,延遲物件的釋放

void autoreleasetest2()

nslog(@"出上面的大括號,只要不出自動釋放池是不釋放所指記憶體空間的!");

}}

2014-08-13 20:06:45.890 arcdemo[4448:303] 把自動釋放物件在自動釋放池裡置空,其所指記憶體空間是不會被釋放的!

2014-08-13 20:06:45.892 arcdemo[4448:303] 出上面的大括號,只要不出自動釋放池是不釋放所指記憶體空間的!

2014-08-13 20:06:45.892 arcdemo[4448:303] obj,物件被釋放啦!

從上面可以看出即使把指向記憶體空間的自動釋放型別的指標置空,其對應的記憶體空間不像強引用那樣被直接釋放掉,而是等到自動釋放池結束後在釋放,這就是延遲釋放。

3.被自動釋放型別的指標用過的記憶體空間,在自動釋放池結束的時候一樣會被釋放掉。

//情況3:自動釋放型別和自動釋放池的配合,延遲物件釋放有可能造成暫時性的記憶體洩露

void autoreleasetest3()

}nslog(@"一塊釋放了兩個,上面分配的記憶體空間被自動釋放型別的變數用過,出自動釋放池時就會被釋放");

}

strong, autoreleasing,weak混在一起的使用情況:

記憶體空間只要有autoreleasing或者strong的指標所持有,就不會被釋

1.strong和autoreleasing的混用:

(1).strong型別的指標指向自動釋放的空間(強引用指標釋放的時候才會釋放記憶體空間)

(2).自動釋放型別的指標指向strong型別的指標所分配的空間的情況(出自動釋放池的時候才會釋放記憶體空間)

(3).strong 型別的指標會指向自動釋放型別的空間記憶體,當strong指標被置空時該記憶體不會被釋放(出自動釋放池的時候才會釋放記憶體空間)

2.弱型別和自動釋放型別的混用

即使有弱引用型別的指標指向該記憶體空間在出自動釋放池的時候,該記憶體空間也會被釋放。弱引用的指標會被置零

ios記憶體管理

引用計數 每個物件有乙個與之相關的整數,稱作 引用計數器 或者 保留計數器 當某段 需要訪問乙個物件時,該段 會將物件的保留計數器 1,表示需要訪問這個物件 當結束對該物件的訪問時,保留計數器 1,表示它不在訪問該物件 當保留計數器為0時,物件被銷毀,所佔記憶體被系統收回。當使用new retain...

iOS記憶體管理

前提 1 以下是針對cocoa物件,不包括core foundation 2 cocoa物件都是用引用計數來跟蹤物件的記憶體使用情況的。3 在子類裡面父類先初始化和後釋放的原則。自己想下為什麼 棧空間和堆空間的區別。我們說的記憶體管理都是基於堆空間的,因為函式內的棧空間是由編譯器自己控制的。關於co...

IOS 記憶體管理

範圍 任何繼承了nsobject的物件,對基本資料型別無效 原理 每個物件內部都儲存了乙個與之相關聯的整數,稱為引用計數器 當使用alloc new或者copy建立乙個物件時,物件的引用計數器被設定為1 給物件傳送一條retain訊息,可以使引用計數器值 1 給物件傳送一條release訊息,可以使...