一:使用nsmutablearray例項時的三個記憶體管理要點
1.物件加入nsmutablearray例項時,物件會收到retain訊息;陣列物件會成為該物件的擁有方,並得到乙個指向該物件的指標。
2.物件從nsmutablearray例項移出時,會收到release訊息;陣列物件會放棄該物件的所有權,並失去指向該物件的指標。
3.釋放nsmutablearray物件時,其下所有物件都會收到release訊息。
二:retain計數規則
1. 如果開發中用來建立物件的方法,其方法名是以alloc或new開頭的,或是包含copy(例如 alloc ,copy和mutablecopy方法),那麼我們的類例項就已經得到了該物件的所有權。於是我們需要負責在不需要該物件的時候將其釋放。這就是一種責任制的方式,誰擁有所有權,誰釋放。
2.對於任何通過其他方式建立的物件,我們的類例項時沒有所有權的。可以這樣認為新物件的retain計數是1,而且該物件已經在nsautoreleasepool物件中。如果沒有保留該物件,那麼當nsautoreleasepool物件對drain後,物件就會被釋放。
3.如果我們的類例項不擁有某個物件,但是要確保該物件繼續存在,那麼就需要通過向其傳送retain訊息來獲取所有權。(這會使此物件的retain計數+1)。
4.當我們的類例項擁有某個物件並且不在需要該物件的時候,可以向其傳送release訊息或是autorelease訊息。release訊息會使retain計數立即 -1 ,autorelease會在autoreleasepool物件被drain時,再向池中的物件傳送release訊息。
5.只要物件還有至少乙個擁有方,該物件就會一直存在下去。知道物件的retain計數為0後,就會收到dealloc訊息。才會銷毀掉。
6.釋放物件的同時,釋放其下所有的例項變數是釋放記憶體和避免記憶體洩露的重要環節。
7.ios的委託機制中,如果從mvc的設計模式角度看,委託物件通常都是控制器物件。類例項時不會保留它的委託物件。委託機制下,如果委託物件和類例項相互擁有,會產生
retain迴圈。簡單的說,retain迴圈是因為兩個物件相互保留,導致兩者都永遠無法釋放。要避免retain迴圈,需要將delegate屬性設定為assign特性,而不是copy或reatin。物件的指標成員變數指向另外乙個物件,但是不保留該物件。這種情況成為weak reference。
@property (nonatomic ,assign) id delegate;
擁有物件可以確保該物件的存在,避免像不存在的物件傳送訊息。所以,當物件不能保留它的委託物件時,委託物件必須負責在釋放自己的時候通知相應的物件。
三. uiviewcontroller
和其它物件一樣,檢視控制物件也是通過alloc和init建立的。但是檢視控制物件不會在建立的那一刻馬上建立相應的檢視,而是要等到真正的需要試圖時,才會通過呼叫loadview來建立。這種延遲建立的做法能提高記憶體的使用效率。例如:如果某個標籤條有很多uiviewcontroller物件,那麼任何乙個uiviewcontroller物件的檢視,只會在相應的標籤項被選中時才會被建立出來。檢視控制物件會在收到view訊息的那一刻載入檢視。 在uiviewcontroller的初始化方法裡訪問例項變數view,會導致延遲載入機制失效。這個問題看似不嚴重,但如果考慮記憶體過低警告的因素,問題就大了。
所以,可以定出以下規則:不要在檢視控制物件的初始化方法中訪問該物件的檢視。如果知道你對檢視有額外的工作需要完成,可以在viewdidload中實現。
四:記憶體過低警告
當系統的可用記憶體過低時,系統會向當前執行的應用發出記憶體過過低警告。收到該訊息的應用需要做一下回應:在收到訊息的那一刻,釋放所有不需要使用的,有易於重建的資源。檢視控制物件會在發出記憶體過低警告是收到didreceivememorywarning訊息。didreceivememorywarning方法的預設實現:
檢查檢視控制物件的檢視是否可見,如果不可見就釋放掉(如果可見就什麼也不做);
ios開發中理解記憶體的管理技巧應該從區域性的角度考慮問題。只關心類內部對物件的使用,以類為分界考慮記憶體管理問題。
此內容來自 iso程式設計 讀書筆記。
iOS開發 記憶體管理之記憶體分配
下面舉個例子說明下 nsstring string string nsstring alloc initwithstring hello ios 這裡string其實就是乙個指標,oc中除了基本資料型別之外的變數型別都是指標型別,oc物件都是通過指標進行操作的。第一段 定義了nsstring型別的指...
ios開發 記憶體管理 理解
retaincount是引用計數的意思。使用release使retaincount 1,使用retain使retaincount 1,當retaincount等於0的時候,該物件會被釋放掉。非arc記憶體管理 1 如果呼叫了alloc new copy產生了乙個新物件,最後肯定要呼叫一次releas...
iOS開發 漫談記憶體管理(一)
1 mrc與arc 蘋果提供兩種記憶體管理機制 一種是mrc manual reference count 即手動引用計數 還有一種是arc auto reference count 即自己主動引用計數。手動引用計數,顧名思義。須要程式猿主動呼叫retain release等方法來管理記憶體。而自己...