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

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

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

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


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

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

使用前
使用后



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

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


自動釋放池

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

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


for page in pages {

? ? @autoreleasepool{

? ? // 生成大量對象,并注冊到

? ? //

? ? }

? ? // pool drain,池中對象將全體釋放

}

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

id obj = [[anyClass alloc] init];

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容