延遲release操作蜓斧,加入到棧頂
什么時(shí)候釋放
手動(dòng)添加的甸各,是在當(dāng)前作用域大括號(hào)結(jié)束時(shí)釋放
非手動(dòng)添加的他膳,Autorelease對(duì)象是在當(dāng)前的runloop迭代結(jié)束時(shí)釋放的惦银,而它能夠釋放的原因是系統(tǒng)在每個(gè)runloop迭代中都加入了自動(dòng)釋放池Push和Pop
原理
參考:
AutoreleasePool并沒(méi)有單獨(dú)的結(jié)構(gòu)堕阔,而是由若干個(gè)AutoreleasePoolPage以雙向鏈表的形式組合而成(分別對(duì)應(yīng)結(jié)構(gòu)中的parent指針和child指針)
使用@autoreleasepool{}來(lái)使用一個(gè)AutoreleasePool棍厂,隨后編譯器將其改寫(xiě)成下面的樣子:
void *context = objc_autoreleasePoolPush();
objc_autoreleasePoolPop(context);
而這兩個(gè)函數(shù)都是對(duì)AutoreleasePoolPage的簡(jiǎn)單封裝,所以自動(dòng)釋放機(jī)制的核心就在于這個(gè)類印蔬。
AutoreleasePoolPage是一個(gè)C++實(shí)現(xiàn)的類
向一個(gè)對(duì)象發(fā)送- autorelease消息勋桶,就是將這個(gè)對(duì)象加入到當(dāng)前AutoreleasePoolPage的棧頂next指針指向的位置