IOS中Cocoa對象的內存管理初探(簡介)

在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,負責對象的管理。

在手動引用計數模式下,對象的釋放需要遵循下述原則:

  1. 如果通過分配和初始化的方法創建了對象[alloc,init方法創建],則需負責該對象的釋放;
  2. 如果持有了對象[retain],也需負責該對象的釋放;
  3. 如果拷貝了對象[copy],也需負責該對象的釋放;
  4. 爲了避免循環引用,子對象不應該持有父對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章