為什么要進行內存管理?
答:因為系統可供程序使用的資源都是有限的,這些西苑包括內存,打開文件數量,以及網絡連接等。程序運行的時候,程序會一直占用資源,不進行清理,資源將會耗盡,程序將可能崩潰.
內存管理機制?
cocoa采用了一種稱為引用計數器的技術。每個對象都有和他相關聯的整數,當某段代碼需要訪問一個對象時,該代碼將該對象的引用計數器的值加1,當這段代碼結束時,講該對象的引用計數器減一,表示他不再訪問這個對象,當引用計數器的值為0時,將不再有代碼訪問該對象,對象被銷毀,其占用的內存被系統收回。
1.當使用alloc 、new或者通過copy消息創建一個對象時,對象的引用計數器的值為1,要增加對象的引用計數器的值,可以給對象發送一條retain消息,要減少對象的引用計數器值可以給對象發送一條release消息。
2.當一個對象因為引用計數器為0即將被銷毀時間,OC自動向對象發送一條dealloc消息,可以在自己的對象中重寫 dealloc的方法,不能直接調用。
自動釋放池(NSAutoreleasePool)
是一個存放實體的集合,這些實體可能是對象,能夠被自動釋放。
NSObject類提供了一個autorelease的方法,該方法預先設定了一條在將來某個時間會發送的release消息,其返回值是接受消息的對象。當自動釋放池被銷毀的時候,會向該池中的多有對象發送release消息。
自動釋放池銷毀時間
創建一個自動釋放池,該池自動成為活動的池,釋放該池時,其引用計數器為0,該池被銷毀,在銷毀過程中,該池子釋放所有包含的對象。
內存管理規則
1.當你使用new,alloc或者copy創建一個對象時,該對象的引用計數器值為1,當你不再使用這個對象時,你要負責向該對象發送一條release或者autorelease消息。這樣,對象將在其使用結束時被銷毀。
2.當你通過任何一個其他方法獲得一個對象時,則假設該對象的保留計數器值為1,而且已經被設置為自動釋放,你不需要執行任何操作來確保該對象被清理,如果打算在一段時間內擁有該對象,則需要保留它并確保在操作完成時釋放它。
3.如果你保留了某個對象,你需要釋放或自動釋放對象,必須保持retain和release方法的使用次數相等。