標籤:
1.記憶體管理概述
1.1什麼是記憶體管理:記憶體管理是程式設計中常用的資源管理的一部分,每個電腦系統可供程式使用的記憶體都是有限的。
1.2為什麼要使用記憶體管理:當我們的程式運行結束的時候,作業系統將回收其我們程式佔用記憶體。但是,只要程式還在運行,它就會一直佔用記憶體。如果不進行及時清理不用的記憶體,記憶體最終將被耗盡。每個程式都會使用記憶體,我們必須確保在需要的時候分配記憶體,而在程式運行結束時釋放佔用的記憶體。如果我們只分配而不釋放記憶體,將發生記憶體流失。
1.3引用計數:
1.3.1隻有當你對一個對象了alloc,copy或retain等操作以後,你才擁有它的引用。
1.3.2當你不需要這個對象時,你應當釋放你對他的引用。
1.3.3你不可以對你沒有引用的對象執行釋放操作。
IOS一旦出現記憶體不足的情況,ios平台會通知所有已經啟動並執行APP,不論是前台APP還是後台掛起的APP,都會收到 memory warning 的notice 一旦APP收到 memory waring 的 notice 就應該回收佔用記憶體較大的變數。
1.4 記憶體警報處理:
1、程式收到系統發來 memory waring
2、程式釋放佔用較大的記憶體。
3、系統回收此程式所建立的atutorelease的對象。
2.記憶體管理
2.1手工引用計數和自動釋放池
手工管理記憶體的範圍:任何繼承了NSObject 的對象,並且使用了alloc、copy、mutableCopy和New為首碼的方法建立的對象都不會被自動釋放,則需要進行手動管理。
引用計數:對象被建立的時候預設帶有4個自己的引用計數器,並且預設的值為1,當引用計數的值為0的時候,對象將被系統銷毀。
擷取引用計數:給對象發送 retainCount訊息獲得當前的引用計數,傳回值是無符號長整型,可以使用如下語句列印:
NSLog(@“%zi”,[person retainCount]);
獲得引用:
alloc:為一個新對象分配記憶體,並將它的引用計數置為1.調用alloc方法你便擁有了新對象的所有權。
retain:是對象的引用計數+1,並獲得對象的引用。
釋放引用:
release:是對象的引用計數減1。
autorelease:是對象的引用計數在未來的某個時候減1,而當前引用計數並沒有變。
當引用計數為0的時候,系統則會自動調用繼承自NSObject的 dealloc 方法,釋放所記憶體,然後為了能夠釋放由對象建立或保持的執行個體變數或者其他對象,需要複寫Dealloc方法,但是不建議直接調用dealloc方法,因為這個是由系統進行調用的。
記憶體管理原則:
*誰建立,誰釋放,如果你通過alloc、new或copy來建立一個對象,那麼你必須調用release或autorelease。
*一般來說,除了alloc、new或copy之外的方法建立的對象都被聲明了autorelease。
*誰retain,誰release。只要你調用了retain,無論這個對象是如何產生的,你都要調用release。
黑馬程式員_IOS開發_Objective-C學習筆記_記憶體管理