詳談Objective-C內存管理機制
Objective-C內存管理機制是本文要介紹的內容,最近iphone平臺比較火,大家都一窩蜂的上了。不過貌似好多都是從Java轉過來的程序員,用慣了Java的,對Objective-C可能會不大適應,特別是Objective-C的內存管理機制。
手機平臺不同于計算機,雖然開發的應用都是小巧的應用,但是由于手機硬件上的局限性,如 果不對內存好好管理的話,還是會出很多問題的,特別是習慣了垃圾回收機制的Java程序員,最容易忽視這個問題。希望下面這篇文章能對大家有所幫助。
Objective-C使用了一種叫做持有計數(Retain Count)的機制來管理內存中的對象。
在 Objective-C中每個對象都對應著他們自己的持有計數(Retain Count),持有計數可以理解為一個整數計數器,當使用alloc方法創建對象的時候,持有計數會自動設置為1。當你向一個對象發送retain消息 時,持有計數數值會增加。相反,當你像一個對象發送release消息時,持有計數數值會減小。當對象的持有計數變為0的時候,對象會釋放自己所占用的內 存。
為什么要使用持有計數這個概念呢?
想象一下,有時候你會在多個不同對象中引用同一個對象。當你在一個地方 釋放這個公用對象 時,勢必會對其他引用這個公用對象的對象產生影響。但是如果每當你引用這個公用對象時,都向持有計數發送一個retain消息,釋放一個對象時,發送一個 release消息。這樣對象的持有計數會記錄到底有多少個對象引用了它自己。當它的持有計數變為0的時候,這意味著沒有其他對象引用這個對象了,那么它 可以安全的釋放自己所占用的內存。
對上面情況的一個比較形象的比喻,假設我們有一條狗和幾個用繩子牽著這條狗的人,那么不到***一個人松掉手中的繩子,這只狗是不能獲得自由的。而持有計數的作用就是記錄了到底有多少個人牽著繩子。
不 同于Java的垃圾回收,Objective-C提供了持有計數這種特別機制。它給予了開發者們更多的控制權,去控制什么時候和怎么樣來釋放一個對象,但 是這同時需要開發者們更加的細心。如果你過早的釋放了一個對象,那么你的應用程序很可能會意外宕掉。相反,如果你很長時間不釋放對象占用的內存,那么應用 程序在運行了一段時間后很可能會造成內存泄漏。
數組(Array)是一個比較特別的例子,當你往數組里面添加一個對象時。數組里面存儲的并不是這個對象的拷貝,而只是一個指向該對象的指針。數組在保存 這個指針的同時會向指針所指的對象發送一個retain消息,相應的,對象的持有計數會增加。將對象從數組中移除的時候,同樣會向對象發送release 消息,對象的持有計數會減小。當我們釋放這個數組時,會向保存在這個數組中的所有對象發送release消息??聪旅娴膬蓚€例子:
1、沒有釋放內存的版本
- array = [[NSMutableArray alloc] init];
- for ( i = 0; i < 10; i++) {
- newNumber = [[NSNumber alloc]initWithInt:(i * 3)];
- [array addObject:newNumber];
- }
上 面的代碼在創建newNumber對象時,向對象的發送了retain消息,對象的持有計數變為1。當向array中添加這個對象的引用時,又向對象發送 了一次retain消息,這樣對象的持有計數就變為2了,在使用完array時,我們會習慣性的釋放掉array,但這樣并不會釋放array所持有的對 象,而只是使所有對象的持有計數變為1,這些對象依然會占用著內存。
2、釋放內存的版本
- for (i = 0; i < 10; i++) {
- newNumber = [[NSNumber alloc]initWithInt:(i*3)];
- [array addObject:newNumber];
- [newNumber release];
- }
小結:關于詳談Objective-C內存管理機制的內容介紹完了,希望通過本文的學習能對你有所幫助!



















