iOS記憶體管理小總結

2021-07-03 19:35:36 字數 1559 閱讀 5734

1、引用計數機制通過可以遞增遞減的計數器來管理 記憶體。物件建立好之後,其保留計數至少為1。若保留計數為正,則物件繼續存活。當保留計數降為0時,物件就被銷毀了

2、在物件生命週期中,其餘物件通過引用來保留或者釋放此物件。保留與釋放操作分別會遞增及遞減保留計數

3、使用arc一定要記住,引用計數實際上還是要執行的,只不過保留與釋放操作現在是由arc自動為你新增。實際上,arc在呼叫retain、release、autorelease、dealloc這些方法時,並不通過普通的objective-c訊息派發機制,而是直接呼叫底層c語言版本。這樣做效能更好,因為保留及釋放操作需要頻繁執行,所以直接呼叫底層函式能節省很多cpu週期。比方說,arc會呼叫與retain等價的底層函式objc_retain。這也是不能覆寫retain、release、或autorelease的緣由,因為這些方法從來不會被直接呼叫。

4、使用arc時必須遵循的方法名命名規則,若方法名以下列詞語開頭,則返回的物件歸呼叫者所有:alloc、new、copy、mutablecopy。歸呼叫者所有的意思是:呼叫上述四種方法的那段**要負責釋放方法所返回的物件

5、arc也會處理區域性變數與實力變數的記憶體管理,可以用以下修飾符來改變區域性變數與例項變數的語義

__strong:預設語義,保留辭職。

__unsafe_unretained:不保留此值,這麼做可能不安全,因為等到再次使用變數時,其物件可能已經**了。

__weak:不保留此值,但是變數可以安全使用,因為如果系統把這個物件**了,那麼變數也會自動清空

__autoreleasing:把物件「按引用傳遞」給方法時,使用這個特殊的修飾符。此值在方法返回時自動釋放

6、arc總結:有了arc之後,程式設計師就無須擔心記憶體管理的問題了,使用arc來程式設計,可省去類中的許多「樣板**」。arc管理物件生命期的方法基本是:在合適的地方插入「保留」及「釋放」操作,在arc環境下,變數的記憶體管理語義可以通過修飾符指明,而原本則需要手工執行「保留」及「釋放」操作。arc只是負責管理ojective-c物件的記憶體,尤其要注意:corefoundation物件不歸arc管理,開發者必須適時呼叫cfretain/cfrelease

7、dealloc方法的呼叫:在 dealloc 方法中,應該做的事情就是釋放指向其他物件的引用,並取消原來訂閱的「鍵值觀察(kvc)」或nsnotificationcenter等通知,不要做其他事情。如果物件持有檔案描述符等系統資源,那麼應該專門編寫乙個方法來釋放此種資源,這樣的類要和其使用者約定:用完資源後必須呼叫close方法。執行非同步任務的方法不應在dealloc裡呼叫,只能在正常狀態下執行的那些方法也不應在dealloc裡呼叫,因為此時物件已處於正在**的狀態了

8、自動釋放池排布在棧中,物件收到autorelease訊息後,系統將其放入最頂端的池裡。合理運用自動釋放池,可降低應用程式的記憶體峰值。@autoreleasepool這種新式寫法能建立出更為輕便的自動釋放池

9、殭屍物件:系統在**物件時,可以不將其真的**,而是把它轉化為殭屍物件,通過環境變數nszombieenabled可開啟此功能。系統會修改物件的isa指標,令其指向特殊的殭屍類,從而使該物件變為殭屍物件,殭屍能夠響應所有的選擇子,響應方式為:列印一條包含訊息內容及其接受者的訊息,然後終止應用程式

iOS 記憶體管理總結

一 自動釋放池 自動釋放池,任何標記為自動釋放並因此新增到池中的物件,將在池本身被釋放的同時也自動釋放,程式可以有多個自動釋放池,它們還可以是巢狀的。如果程式在執行時將產生大量的臨時物件,就可能需要在程式中建立多重自動釋放池。例如 for inti 0 i 1000000 i 在執行此段 的時候會有...

ios記憶體管理總結

1.在init函式中必須呼叫 super init 函式dealloc中必須呼叫 super dealloc 2.呼叫以 alloc new copy mutablecopy 開頭函式的生成的物件,必須release 3.物件呼叫retain,必須release 4.物件可以呼叫autoreleas...

iOS記憶體管理的問題總結

這幾個關鍵字在宣告變數的時候經常遇到,那麼它們有什麼區別,應該如何選擇呢?這些關鍵字的主要區別,在於對記憶體的管理。首先,要介紹一下objective c的記憶體管理機制。objective c對記憶體的管理,以一種叫做 retain count 的方式來管理。對於乙個物件,當它被new alloc...