iphone(object-c) 記憶體管理(1)

來源:互聯網
上載者:User

現在搞iphone開發,一直不是很懂object-c的記憶體管理機制,看到apple的官方文檔寫的不錯而又沒有找到翻譯的文章。於是自己在學習它的過程中就順便把它翻譯了,自己的英語不是太好,文字組織能力那就更菜了,讀的蹩腳之處還望大家指出,我好在以後的翻譯過程中好好改正。第一次翻譯,歡迎拍磚,可不要把我拍死了呀!!!

文章中帶有LPSTUDY的字樣表明是我個人的理解,可能會有不對的地方,敬請指教。

文章原文連結地址:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1

本文部落格地址:

http://blog.csdn.net/lipeng08/article/details/7702707

關於記憶體管理

記憶體管理指的是你的程式在運行過程中進行記憶體的分配,使用,以及釋放它的過程。一個經過仔細編碼的程式總是儘可能使用更少的記憶體。在object-c中,記憶體管理也被看作是你對擁有的有限的記憶體資源進行資料和代碼的合理分配的過程。如果你仔細通讀了本篇文檔,你將能夠合理的管理對象的生命週期以及適時的釋放不再被程式使用的記憶體。

 

記憶體管理看起來似乎是單個對象的操作,但實際上我們總是在管理著對象圖。

LPSTUDY:

1.    1:Class A中通過調用alloc/init方法建立了一個對象,此處我命名此對象為aObject,此時由於aObject調用了alloc方法,它的引用計數(retain count)是1

2.    在Class B中對aObject進行了retain操作,這樣會增加aObject的引用計數,即為2

3.    Class C想要使用aObject,於是它調用了copy操作,這樣Class C會擁有aObject的拷貝,這個和retain操作不一樣。retain操作僅僅增加了aObject指向的實際記憶體的引用計數,copy操作是又申請了一塊記憶體, 此記憶體引用計數為1,通過copy操作,Class C可以自由處理此塊記憶體(這個只有處理是有限制的,受被copy元素的屬性限制),將此塊記憶體命名為cObject。

4.    Class A調用了release方法,此時aObject的引用計數減1,變為1

5.    Class B又調用了一次release方法,引用計數為0,此塊記憶體被釋放。

6.    Class C對自己cObject調用了release方法,retain減1,變為0,此塊記憶體被釋放。

 

概覽:

object-c提供了三種記憶體管理方法

1.    Retain-Release方式:簡稱MRR,這個需要程式員很清楚的跟蹤自己的對象來管理記憶體,它是通過使用基類NSobject提供的引用計數模型進行管理的。當引用計數為0,此塊記憶體被釋放。

2.    自動引用字數方式:簡稱ARC,它也是使用了同樣的引用計數機制,它在編譯的時候自動幫你添加了記憶體管理方法。如果你使用了ARC,很多底層的機制你就無需知道了。

see Transitioning to ARC Release Notes

 3.    記憶體回收:系統自動跟蹤對象的依存關係,然後自動釋放不再被引用的對象。它使用一個與自動引用計數不同的機制,不過僅僅在Mac Os X中使用,不可以用於IOS。

 see GarbageCollection Programming Guide.

 

如果你想在IOS上編程,你必須使用顯式的記憶體管理(這篇文檔的主題),如果更進一步,你計劃寫一些庫,或者外掛程式,或者可在記憶體回收和非記憶體回收的程式中使用的共用代碼,你就必須通讀本文檔以使用記憶體管理技術。(在xcode中,你必須在使用或者禁用記憶體回收都測試一下你的代碼)

 

良好的習慣可以避免記憶體方面的問題

主要有兩種問題導致錯誤的記憶體管理

1.    在資料使用的過程中釋放或者重寫資料。

這可能引起記憶體崩潰,更典型的如程式崩潰,使用者資料出錯。

資料不再被使用,仍然不釋放記憶體會導致記憶體泄露

2.    記憶體泄露是值你仍然不去釋放已經不會再被使用的記憶體。記憶體泄露導致你的程式佔用記憶體過多,從而導致系統效能下降或者在IOS中被強制終止。

不要僅僅從引用計數來看記憶體管理,那樣你會陷入實現的細節而脫離你真正的目標。你應該更多的從對象所有者和對象圖來考慮記憶體管理。

Cocoa使用了簡單的命名規範來表明你調用的方法返回的對象的記憶體類型。

See “MemoryManagement Policy.”

雖然比較基本的策略很明確,但同樣有一些很實用的步驟可以協助你更容易的管理記憶體,從而是你的程式更健壯,更可靠,同時減少記憶體的實用

See “Practical Memory Management.”

 

自動釋放池提供了一種向對象延遲發送釋放訊息的機制,當你放棄一個對象的所有權而又不想它立刻被釋放(例如你向從一個方法中返回一個對象)時,這種機制是非常有用的。有些場合你需要用到對象自動釋放池

See “Using Autorelease Pools.”

 

使用程式碼分析工具來調試記憶體問題

為了發現你在編譯時間候的代碼問題,你可以使用xcode的use the ClangStatic Analyzer 

 

如果記憶體管理問題確實發生了,同樣有一些工具和技術來檢測和尋找問題

·     很多的技術工具在Technical Note TN2239,iOSDebugging Magic中被描述,特別是使用NSZombie來協助你發現over-released 的對象。

·     你也可以使用工具來跟蹤引用計數事件來尋找記憶體泄露的問題。See “CollectingData
on Your App”.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.