Autorelease對象是在當前的runloop迭代結(jié)束時釋放的,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop 舌狗;
ARC下叽奥,我們使用@autoreleasepool{}來使用一個AutoreleasePool,隨后編譯器將其改寫成下面的樣子:
void *context = objc_autoreleasePoolPush();
// {}中的代碼
objc_autoreleasePoolPop(context);
而這兩個函數(shù)都是對AutoreleasePoolPage的簡單封裝把夸,所以自動釋放機制的核心就在于這個類而线。
objc_autoreleasePoolPush()和objc_autoreleasePoolPop(...)實際上會調(diào)用到AutoreleasePoolPage類的push()和pop()方法;
使用容器的block版本的枚舉器時恋日,內(nèi)部會自動添加一個AutoreleasePool:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// 這里被一個局部@autoreleasepool包圍著
}];
當然,在普通for循環(huán)和for in循環(huán)中沒有嘹狞,所以岂膳,還是新版的block版本枚舉器更加方便。for循環(huán)中遍歷產(chǎn)生大量autorelease變量時磅网,就需要手加局部AutoreleasePool咯谈截。
參考學習:
iOS 底層拾遺:AutoreleasePool :https://juejin.im/post/5da2e2806fb9a04ddc62481b
黑幕背后的Autorelease:http://blog.sunnyxx.com/2014/10/15/behind-autorelease/