for循環(huán)的內(nèi)存溢出問題

最近寫了一個(gè)作品還原的for循環(huán),循環(huán)大概是這樣的。在圖片一多的時(shí)候,就會(huì)崩潰。最后調(diào)試跟蹤后,發(fā)現(xiàn)圖片下載和轉(zhuǎn)碼的時(shí)候,會(huì)使用至少30m的內(nèi)存。問題找到了,就可以處理了。

紅圈處是內(nèi)存使用大戶

添加autoreleasepool以后,情況好多了?


在內(nèi)存消耗最大的地方添加了autoreleasepool

然后我下載了一個(gè)含有20張圖片的文檔并進(jìn)行了內(nèi)存跟蹤

使用前
使用后



為什么添加了autoreleasepool就能徹底的釋放內(nèi)存了呢?

這里就要講到內(nèi)存的管理機(jī)制。


自動(dòng)釋放池

每次創(chuàng)建的對(duì)象(都是autorelease屬性)都會(huì)被注冊(cè)到該線程中的autorelease pool中,在當(dāng)次代碼塊沒有執(zhí)行完之前,pool里的對(duì)象是不會(huì)釋放的。

在添加autorelease pool以后,池的block作用域外,該pool會(huì)被drain,其中注冊(cè)的對(duì)象全部都會(huì)release,這樣就保證內(nèi)存不會(huì)出現(xiàn)不足的情況。


for page in pages {

? ? @autoreleasepool{

? ? // 生成大量對(duì)象,并注冊(cè)到

? ? //

? ? }

? ? // pool drain,池中對(duì)象將全體釋放

}

那蘋果是如何實(shí)現(xiàn)的呢?

id obj = [[anyClass alloc] init];

alloc // 計(jì)算容納對(duì)象所需的空間大小,內(nèi)存空間置0后返回一個(gè)isa指針,

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

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

  • 1.1 什么是自動(dòng)引用計(jì)數(shù) 概念:在 LLVM 編譯器中設(shè)置 ARC(Automaitc Reference Co...
    __silhouette閱讀 5,469評(píng)論 1 17
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,080評(píng)論 1 16
  • 自動(dòng)引用計(jì)數(shù) 自動(dòng)引用計(jì)數(shù):指內(nèi)存管理中對(duì)引用采取自動(dòng)計(jì)數(shù)的技術(shù)。 內(nèi)存管理/引用計(jì)數(shù) 持有對(duì)象引起引用計(jì)數(shù)加...
    南京小伙閱讀 1,420評(píng)論 2 3
  • 前言 從我開始學(xué)習(xí)iOS的時(shí)候,身邊的朋友、網(wǎng)上的博客都告訴我iOS的內(nèi)存管理是依靠引用計(jì)數(shù)的,然后說引用計(jì)數(shù)大于...
    蓋世英雄_ix4n04閱讀 659評(píng)論 0 1
  • 《似 歪 集》 直中有礙, 曲中無奈! 似是而歪, 集名《似歪》!
    明無間閱讀 253評(píng)論 0 1

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