之前跟同事討論過一個(gè)問題:
開啟子線程
是否會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的自動(dòng)釋放池屿聋?
根據(jù)StackOverFlow
上這篇問答所討論:
在當(dāng)前線程第一次發(fā)送autorelease時(shí)驱证,
會(huì)進(jìn)行自動(dòng)釋放池的創(chuàng)建,
因而不會(huì)造成內(nèi)存泄漏蕊温。
個(gè)人認(rèn)為這個(gè)特性可以看做是自動(dòng)釋放池的懶加載
。
從源碼處(版本:objc4-723
)可論證一下:
在對(duì)一個(gè)對(duì)象發(fā)送autorelease
消息時(shí),運(yùn)行時(shí)會(huì)調(diào)用以下c函數(shù):
static inline id *autoreleaseFast(id obj)
{
AutoreleasePoolPage *page = hotPage();
if (page && !page->full()) {
return page->add(obj);
} else if (page) {
return autoreleaseFullPage(obj, page);
} else {
return autoreleaseNoPage(obj);
}
}
邏輯很清晰:
- 首先獲取當(dāng)前線程的
hot page
拔第,即自動(dòng)釋放池頁棧棧頂位置的那一頁; - 然后判斷是否存在此
hot page
,若存在并當(dāng)前頁未滿,則直接將該對(duì)象指針入池尿背; - 若存在并棧已滿,則需要調(diào)用
autoreleaseFullPage
用于開辟新頁并入池泳猬; - 若不存在
hot page
(no page
,在源碼中注釋為"No page" could mean no pool has been pushed or an empty placeholder pool has been pushed and has no contents yet
)宇植,即當(dāng)前線程還沒有建立自動(dòng)釋放池或只有一個(gè)placeholder pool
得封,則需要調(diào)用autoreleaseNoPage
用于新建一個(gè)自動(dòng)釋放池頁棧并入棧一頁。
因此問答上討論的邏輯應(yīng)該是正確的当纱,但如果子線程全程未使用任何autorelease
對(duì)象的話呛每,應(yīng)該不會(huì)建立自動(dòng)釋放池。