Cocoa內(nèi)存管理規(guī)則與垃圾回收
Cocoa內(nèi)存管理規(guī)則與垃圾回收是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)如何來解決cocoa內(nèi)存管理的問題。不多說,直接來看詳細內(nèi)容詳解。
Cocoa內(nèi)存管理規(guī)則
(1)當你使用new、alloc、copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1.當不再使用該對象時,你要負責向該對象發(fā)送一條release或autorelease消息。這樣,該對象將在其使用壽命結(jié)束時被銷毀。
(2)當你通過其他方法獲得一個對象時,這假設(shè)該對象的保留計數(shù)器值為1,而且已經(jīng)被設(shè)置為自動釋放,你不需要執(zhí)行任何操作來確保該對象被清理。如果你打算在一段時間內(nèi)擁有該對象,這需要保留它并確保在操作完成時釋放它。
(3)如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象。必須保持retain方法和release方法的使用次數(shù)相等。
“如果我使用了new、alloc或copy方法獲得一個對象,則我必須釋放或自動釋放該對象。”只要你記住了這條規(guī)律,你就平安無事了。
無論什么時候擁有一個對象,有兩間事情必須弄清楚:怎樣獲得該對象的?打算擁有該對象多長時間。
例如:
- NSMutableArray *array;array = [[NSMutableArray alloc] init]; //count: 1// use the array[array release]; // count: 0
上例中使用alloc方法獲得了array,所以需要安排該對象的釋放([array release])
又如:
- NSMutableArray *array;array = [NSMutableArray arrayWIthCapacity: 17];// count: 1, autoreleased// use the array
上例中的arrayWithCapacity: 方法不屬于alloc、new、copy中的任何一個,因此可以假設(shè)該對象被返回時保留計數(shù)器值為1而且已經(jīng)被設(shè)置為自動釋放。你不需要顯示釋放array。
垃圾回收(garbage collection)
Objective-C2.0引入了自動內(nèi)存管理機制,也稱垃圾回收。對于已經(jīng)創(chuàng)建和使用的對象,當你忘記清理它們時,系統(tǒng)會自動識別哪些對象仍在使用,哪些對象可以回收。
垃圾回收是一種可選擇啟用的功能,啟用方法是:在菜單選擇Project | Edit Project Settings進入項目信息窗口,搜索“garb”,選擇Required[-fobjc-gc-only]選項即可。如下圖所示:
“-fobjc-gc”選項是為了使代碼即支持垃圾回收又支持對象的保留和釋放。
啟用垃圾回收后,通常的內(nèi)存管理命令全部變成了空操作指令,不執(zhí)行任何操作。
注意:如果開發(fā)iPhone軟件,則不能使用垃圾回收。實際上,在編寫iPhone程序時,蘋果公司建議你不要在自己的代碼中使用autorelease方法,同時還要避免使用創(chuàng)建自動釋放對象的便利函數(shù)。
小結(jié):Cocoa內(nèi)存管理規(guī)則與垃圾回收的內(nèi)容介紹完了,希望本文能對你有所幫助!