最近寫了一個作品還原的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指針,