-
自動釋放池是什么
當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 1. ojc-c 是通過一種"referringcounting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
-
自動釋放池底層實現
自動釋放池以棧的形式實現:當你創建一個新的自動釋放池時,它將被添加到棧頂。當一個對象收到發送autorelease消息時,它被添加到當前線程的處于棧頂的自動釋放池中,當自動釋放池被回收時,它們從棧中被刪除,并且會給池子里面所有的對象都會做一次release操作.
-
代碼演示(減少內存消耗)
圖:創建一個自動釋放池,創建20個Person對象,將對象加入自動釋放池,如果不加循環,手動釋放,那么要等20個Person對象創建完畢后才全部釋放,加入循環手動釋放后,每5次就手動釋放一次,大大的減少了內存的消耗,提高效率
Wyman