Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
1. (Garbage Collection)自動內存計數:這種方式和java類似,在你的程序的執行過程中。始終有一個高人在背後准確地幫你收拾垃圾,你不用考慮它什麼時候開始工作,怎樣工作。你只需要明白,我申請了一段內存空間,當我不再使用從而這段內存成為垃圾的時候,我就徹底的把它忘記掉,反正那個高人會幫我收拾垃圾。遺憾的是,那個高人需要消耗一定的資源,在攜帶設備裡面,資源是緊俏商品所以iPhone不支持這個功能。所以“Garbage Collection”不是本入門指南的范圍,像對“Garbage Collection”內部機制感興趣的同學可以參考一些其他的資料,不過說老實話“Garbage Collection”不大適合適初學者研究。
解決: 通過alloc – initial方式創建的, 創建後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中做相應次數的release就好了.
2. (Reference Counted)手動內存計數:就是說,從一段內存被申請之後,就存在一個變量用於保存這段內存被使用的次數,我們暫時把它稱為計數器,當計數器變為0的時候,那麼就是釋放這段內存的時候。比如說,當在程序A裡面一段內存被成功申請完成之後,那麼這個計數器就從0變成1(我們把這個過程叫做alloc),然後程序B也需要使用這個內存,那麼計數器就從1變成了2(我們把這個過程叫做retain)。緊接著程序A不再需要這段內存了,那麼程序A就把這個計數器減1(我們把這個過程叫做release);程序B也不再需要這段內存的時候,那麼也把計數器減1(這個過程還是release)。當系統(也就是Foundation)發現這個計數器變成了0,那麼就會調用內存回收程序把這段內存回收(我們把這個過程叫做dealloc)。順便提一句,如果沒有Foundation,那麼維護計數器,釋放內存等等工作需要你手工來完成。
解決:一般是由類的靜態方法創建的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 創建後引用計數+0, 在函數出棧後釋放, 即相當於一個棧上的局部變量. 當然也可以通過retain延長對象的生存期.
3. (NSAutoRealeasePool)內存池:可以通過創建和釋放內存池控制內存申請和回收的時機.
解決:是由autorelease加入系統內存池, 內存池是可以嵌套的, 每個內存池都需要有一個創建釋放對, 就像main函數中寫的一樣. 使用也很簡單, 比如[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即將一個NSString對象加入到最內層的系統內存池, 當我們釋放這個內存池時, 其中的對象都會被釋放.