iOS 內(nèi)存管理

自動釋放池

AutoreleasePool的實現(xiàn)原理是怎么樣的?

AutoreleasePool是以棧為結(jié)點,通過雙向鏈表的形式組合而成的數(shù)據(jù)結(jié)構(gòu)。編譯器會將@autoreleasepool{}改寫,如下 圖。實際objc_autoreleasePoolPop函數(shù)在內(nèi)部做了pop操作,批量將autoreleasepool中的所有的對象都會做一次release操作。

編譯器改寫@autoreleasepool{}

下面對上面的主要函數(shù)進行一個簡單的說明

AutoreleasePool的結(jié)構(gòu)

1)是以棧為結(jié)點通過雙向鏈表的形式組合而成

2)是和線程一一對應的


[obj autorelease]的實現(xiàn)(對象加入自動釋放池)

先判斷當前next指針是否指向棧頂,如果不是直接加入;如果是,則增加一個棧結(jié)點到鏈表上,在新的棧添加對象;移動next指針

AutoreleasePoolPage::push實現(xiàn)流程(釋放池多層嵌套)

插入哨兵對象


AutoreleasePoolPage::pop實現(xiàn)流程(與push相反)

? ??根據(jù)傳入的哨兵對象找到對應的位置

? ??給上次push操作之后添加的對象依次添加release消息

? ??回退next指針到正確的位置

AutoreleasePool為何可以嵌套使用?

多次插入哨兵對象,也就是對一個新的releasePool的創(chuàng)建,如果當前棧沒有滿,則不需要創(chuàng)建新的page,如果滿了,新增一個棧節(jié)點

下面這個圖中,array對象在什么時候釋放呢?


在當次runloop將要結(jié)束的時候調(diào)用AutoreleasePoolPage:pop(),對array對象執(zhí)行release操作。

AutoreleasePool的使用場景?

在for循環(huán)中,alloc圖片數(shù)據(jù)等內(nèi)存消耗較大的場景手動插入autoreleasePool,每一次for循環(huán)都進行一次內(nèi)存的釋放,降低內(nèi)存消耗。

常見的循環(huán)引用以及破除方法:

代理(delegate)

block

NSTimer

大環(huán)引用

如何破除循環(huán)引用?

__weak

__block

__unsafe_unretained(與weak等效)

__block在ARC和MRC條件下的區(qū)別

MRC下,__block修飾對象不會增加其引用計數(shù),避免了循環(huán)引用

ARC下,__block修飾對象會被強引用,無法避免,需手動破環(huán)

NSTimer? 循環(huán)引用解決


如果沒有其他處理,只是單純地在dealloc中寫定時器的銷毀方法,在退出當前控制器后,由于定時器的循環(huán)引用問題導致當前類沒有釋放銷毀,也就不會走dealloc 方法,所以退出控制器后定時器仍然在執(zhí)行。

1)在退出界面時手動調(diào)用定時器銷毀的方法。

2)引入中間者


3) 高級中間者

此時我們需要借助一個虛基類NSProxy,(NSProxy其主要用來消息轉(zhuǎn)發(fā)的處理)




4、帶block的timer

在我們創(chuàng)建timer的時候,蘋果也意識到NSTimer的api是存在一定問題的,所以在iOS10.0之后提供了一種block的方法來去解決NSTimer的循環(huán)引用的問題.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、內(nèi)存布局 stack:方法調(diào)用 heap:通過alloc等分配對象 bss:未初始化的全局變量等。 data:...
    AKyS佐毅閱讀 1,722評論 0 19
  • 1.weak的實現(xiàn)原理?SideTable的結(jié)構(gòu)是什么樣的 weak:其實是runtime全局維護的一個hash表...
    6ffd6634d577閱讀 1,153評論 0 2
  • ? 前言:隨著手機市場日新月異的更新,目前無論安卓手機還是iPhone手機的內(nèi)存都越來越大,但是手機系統(tǒng)和App...
    阿餅six閱讀 924評論 6 7
  • 學習了好久的iOS內(nèi)存管理,一直是斷斷續(xù)續(xù)的,現(xiàn)在有時間找了個機會總結(jié)了一下,有時候時間久了好多知識點就會遺忘,希...
    YYFast閱讀 2,488評論 1 9
  • 文章目錄 一.內(nèi)存管理準則 二.屬性內(nèi)存管理修飾符全解析 三.block中的weak和strong 四.weak是...
    YouKnowZrx閱讀 1,124評論 5 10

友情鏈接更多精彩內(nèi)容