最近寫了一個(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指針,