在Cocoa對象的生命週期中,有創建、初始化、被使用、被持有或拷貝、被釋放(release或dealloc)等過程。
與Java具有垃圾收集(GC:即Gabage Collection)的機制不同,IOS中,對象的管理需要通過對象的引用計數(Retain Count)來標識。
對象的引用計數用於標識對其感興趣的對象的書目,在使用alloc、init方法初始化對象之後,會置該對象的引用計數爲1.在使用方法調用時,對象的引用計數的變化如下表1:
表1. 方法調用過程中對象的引用計數值變化表
方法名 引用計數值
alloc/init 1
retain/copy +1[表示加1]
release -1[表示減1]
dealloc 0[釋放對象]
上面的方法調用屬於手動引用計數(MRC:Munual reference counting)模式,之後蘋果在ios 5中推出了自動內存管理功能,簡稱爲ARC(Automatic reference counting).在創建對象時,使用autorelease 方法,之後對象的管理交由編譯器完成。編譯器會自動跟蹤對象的使用和引用情況,在編譯階段在代碼當中插入合適的retain,release方法,減輕了程序員的負擔。
編譯器在實現對象的自動管理時,會將autorelease方法創建的對象放進最近的Autorelease Pool(自動釋放池)當中。由自動釋放池來負責對象的管理,自動釋放池本身可以嵌套和釋放。在作用域結束時,會釋放自動釋放池,其中的對象會隨之釋放。程序的生命週期作用域內,會由Application Kit自動創建一個AutoreleasePool,負責對象的管理。
在手動引用計數模式下,對象的釋放需要遵循下述原則:
- 如果通過分配和初始化的方法創建了對象[alloc,init方法創建],則需負責該對象的釋放;
- 如果持有了對象[retain],也需負責該對象的釋放;
- 如果拷貝了對象[copy],也需負責該對象的釋放;
- 爲了避免循環引用,子對象不應該持有父對象。