iOS的內存相關知識是咱們開發iOS APP的基石之一,也是面試中必然會問的問題。內存知識的融會貫通,與及內存相關問題的解決,是iOS開發者必需要掌握的。面試
iOS的內存管理機制爲引用計數。早期使用的是MRC(手動引用計數),須要開發者本身編寫引用計數的代碼,對開發者是一個不小的挑戰,並且容易出錯,給開發者也帶來了不小的苦惱。框架
蘋果公司爲了讓開發者更好的專一於開發,在2011年的iOS5版本開始引入了ARC(自動引用計數),幫助開發者進行內存的管理。工具
ARC的工做原理大體是:當咱們編譯源碼的時候,編譯器會分析源碼中每一個對象的生命週期,而後基於這些對象的生命週期,來添加相應的引用計數操做代碼。
內存泄漏(memory leak):是指申請的內存空間使用完畢以後未回收。
一次內存泄露危害能夠忽略,但若一直泄漏,不管有多少內存,早晚都會被佔用光,最終致使程序crash。(所以,開發中咱們要儘可能避免內存泄漏的出現)
內存泄漏的現象:程序的可用內存愈來愈少,最終致使程序崩潰。spa
內存溢出(out of memory):是指程序在申請內存時,沒有足夠的內存空間供其使用。
內存溢出的現象:程序直接重啓或者崩潰。code
AFHTTPSessionManager發生內存泄漏的解決方案在此。對象
VC中使用NSTImer
的示例以下:blog
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
理由:這時 target: self,增長了ViewController的retain count,
即self強引用timer,timer強引用self,形成循環引用。
解決方案:在恰當時機調用[timer invalidate]
便可。生命週期
對於delegate咱們通常都是使用weak修飾,這個很少做解釋。圖片
在咱們平常開發中,若是block使用不當,很容易致使內存泄漏。
理由:若是block被當前ViewController(self)持有,這時,若是block內部再持有ViewController(self),就會形成循環引用。
解決方案:在block外部弱化self,再在block內部強化已經弱化的weakSelf。內存
iOS的內存管理機制是:引用計數。MRC基本上已經絕跡,如今主流的仍是ARC。系統的內存分爲棧內存和堆內存,棧內存
是系統管理的,不須要開發者插手,開發者管理的主要是堆內存。
當下咱們使用ARC(自動引用計數)進行管理的是堆內存。
當咱們使用alloc、new建立對象以後,對象的引用計數爲1.
當咱們對對象進行strong、copy操做以後,對象的引用計數+1.
當咱們對對象進行mutableCopy
操做以後,生成了一份對象的拷貝,而不是簡單的引用計數+1
,這個須要特別注意。
當咱們再也不持有對象時,對象的引用計數-1。
當對象的引用計數爲0時,對象會被釋放掉,進行內存的回收。
core foundation框架主要提供的是C語言的API,不屬於ARC管理的範疇,因此使用core foundation建立的對象,須要開發者本身進行內存的管理,在對象使用完畢以後進行內存的回收,不然會進行內存的泄漏。
開發中,對於一些大循環若是把控很差,會出現內存峯值太高的狀況,這個時候咱們須要在循環的內部合理的使用autoreleasepool進行內存峯值的管理。
本文主要是對iOS內存相關的知識點進行了一個概括總結。