二十二、內存管理
1.頁面返回的時候內存會不會下降,為什么
答案是:那要看你想不想讓它降下來。比如說一開始是從甲跳轉到的乙,那么返回時如果乙的對象被釋放掉了內存就會下降,反之不會降。
先說在push跳轉中,如果甲跳轉前是靠著一個局部變量的乙的對象來實現跳轉的,那按理說出了這個某按鈕的點擊事件外后,乙的局部變量就立即應該被釋放了,那乙的頁面也顯示不出來了。。。。怎么可能呢!所以,其實對乙這個局部變量的對象的真正持有者是他們所有頁面的navigationcontroller。在甲調用push到乙的那句方法的一瞬間乙就已經被壓到navigationcontroller的childviewcontrollers隊列里去了,所以乙的這個對象的持有權是由navigationcontroller決定的啦。這種情況下,要想返回頁面時內存能被釋放的話就要特意寫一句讓navigationcontroller pop一下之類的話了;否則要想由甲頁面來決定是否釋放乙的話就得讓這個按鈕的點擊事件里使用的對象是一個特意在甲中定義的乙的成員屬性。
如果是present跳轉的話,其實在甲present乙的時候,甲就持有乙了,甲對乙的引用計數就加一了,如果是局部變量的乙對象的話,那么跳轉過去后乙的引用計數是二,因為乙的臨時對象先被創建,又被甲持有,這樣,乙頁面出了甲的這個點擊事件方法也就引用計數歸零,不復存在了;如果乙是一個全局的屬性,那么出了點擊事件方法后乙的去留還要由甲來決定。
可以重用VC;
用instruments 的leak來查找;
2.常用內存檢查的工具和方法
打包archive,單元測試,1)analyze靜態代碼檢查(不需要運行就能檢查)
2)用instruments 的leak來查找;
3)allocations
4)重寫dealloc方法(定義一個基類,在里面重寫dealloc方法,加一句打印的話,所有該集成uiviewcontroller的就繼承它就行了)
??http://blog.sina.com.cn/s/blog_14d7dd6710102vzq5.html
3.對象什么時候會被釋放,過程是怎樣的
引用計數為0的時候唄,runloop循環檢測機制
4.ARC,MRC各自的具體實現是怎樣的
arc:當ARC開啟時,編譯器將自動在代碼合適的地方插入retain,release和autorelease,不可以寫[super dealloc],ARC是Objective-C編譯器的特性;
mrc:就是要自己去實現retain,release和autorelease,可以寫[super dealloc];
5.什么是內存泄漏,什么情況下會發生,怎么解決
6.block為什么要用copy關鍵字
7.delegate可以使用assign關鍵字嗎
8.iOS應用的內存釋放機制
9.iOS應用從別的應用返回自己這個應用的過程
10.重復釋放的問題
好像ARC可以解決對象重復釋放的問題。
11.ARC下循環引用的問題
解決這個問題就可以兩個互相引用的對象一個使用強引用,另一個使用弱引用。