最近也在面試一些童鞋,問的頻率比較高的問題之一就是內存
我覺得內存管理是ios制勝法寶之一,系統流暢度和美觀,電池續航幾乎構成了蘋果全部優點。現在電池和美觀隨著安卓的崛起,已然沒多少優勢了。而流暢度則依然是安卓打不敗iOS的門檻。
內存管理,不止于系統。還有APP的設計,需要我們iOS開發人員一起來維持流暢性。
我面試問內存管理,其實主要想聽一下幾方面:
1,內存管理的機制
不想談MRC了,太老了,只ARC。ARC機制簡單點說就是引用計數器。
強引用+1(其實創建的時候一般會創建一個強引用指針引用),弱引用不加。強引用每銷毀一個就計數器減一,到0了就會自動找合適時機釋放。釋放目前大部分oc對象會自動釋放,而涉及到C語言需要手動釋放。
2,內存管理工具
instrument
---Leaks 內存泄露監測工具
---Allocations 內存分配工具
---Core Animation監測離屏渲染
---Zommbies僵尸對象的監測
3,造成內存暴增及內存高的緣由
一般內存暴增是因為圖片或者視頻等比較大的文件直接加載到了內存中,或者大圖片濾鏡處理等一些比較耗內存顯存的操作。內存暴增會導致內存警告進而有可能被系統滅掉。
內存高的原因則有幾種,主要指平緩增高。控制器太多,堆棧里不斷加載新的控制器和數據,層層深入。某個界面動畫循環,不斷加載。圖片較大,內存中圖片較多。一般內存平緩增高不會涉及到內存警告。
當然除了循環引用循環調起某方法或操作。
4,內存釋放,內存警告,內存泄露
內存釋放一般有幾種方式:把sd的緩存在內存里的圖片緩存清空。將不在window上顯示的view移除,以及在控制器銷毀時將大的數據集合指針置nil。
內存泄露一般是野指針,指向不存在的對象,或者稱之為內存區域。內存泄露一般為對象提前釋放導致。查找原因則需要借助工具和打斷點,有的藏的比較深的,需要一步一步的去找,沒有什么特別的捷徑。
5,內存優化-控件使用方面-重用-單例-懶加載等等
控件如果不涉及到交互,僅僅是用來顯示,那么layer足夠,輕量級
重用則是cell的重用-原理-NSSet做緩存池-當然也可以數組字典。-離屏放緩存池-即將進屏取cell
無限滾動輪播的imageview重用,定時器與手勢的交互注意事項。
單例的使用-如果一個就能處理,那么整個app只創建一次。(話說,其實類就是一個單例)
懶加載-將不開始就顯示的控件和不使用的集合等等進行懶加載,減少內存集中調用。
另控件及圖片的使用,盡量減少控件和圖片的透明效果,透明越多,需要渲染面積越大。