iOS內存相關的知識點整理

1、原起

iOS的內存相關知識是咱們開發iOS APP的基石之一,也是面試中必然會問的問題。內存知識的融會貫通,與及內存相關問題的解決,是iOS開發者必需要掌握的。面試

2、iOS內存相關知識點

圖片描述

2.1 iOS的內存管理方式

iOS的內存管理機制爲引用計數。早期使用的是MRC(手動引用計數),須要開發者本身編寫引用計數的代碼,對開發者是一個不小的挑戰,並且容易出錯,給開發者也帶來了不小的苦惱。框架

蘋果公司爲了讓開發者更好的專一於開發,在2011年的iOS5版本開始引入了ARC(自動引用計數),幫助開發者進行內存的管理。工具

ARC的工做原理大體是:當咱們編譯源碼的時候,編譯器會分析源碼中每一個對象的生命週期,而後基於這些對象的生命週期,來添加相應的引用計數操做代碼。

2.2 內存泄漏

內存泄漏(memory leak):是指申請的內存空間使用完畢以後未回收。
一次內存泄露危害能夠忽略,但若一直泄漏,不管有多少內存,早晚都會被佔用光,最終致使程序crash。(所以,開發中咱們要儘可能避免內存泄漏的出現)

內存泄漏的現象:程序的可用內存愈來愈少,最終致使程序崩潰。spa

2.3 內存溢出

內存溢出(out of memory):是指程序在申請內存時,沒有足夠的內存空間供其使用。

內存溢出的現象:程序直接重啓或者崩潰。code

2.4 內存泄漏的檢測

  • 第一種:靜態分析方法(Analyze)
  • 第二種:動態分析方法(Instrument工具庫裏的Leaks)

2.5 常見的發生內存泄漏的場景

2.5.1 AFHTTPSessionManager

AFHTTPSessionManager發生內存泄漏的解決方案在此對象

2.5.2 ViewController中的NSTimer

VC中使用NSTImer的示例以下:blog

[NSTimer scheduledTimerWithTimeInterval:1.0 
                                 target:self 
                               selector:@selector(updateTime:) 
                               userInfo:nil 
                                repeats:YES];

理由:這時 target: self,增長了ViewController的retain count
self強引用timertimer強引用self,形成循環引用。
解決方案:在恰當時機調用[timer invalidate]便可。生命週期

2.5.3 ViewController中的delegate

對於delegate咱們通常都是使用weak修飾,這個很少做解釋。圖片

2.5.4 ViewController中Block

在咱們平常開發中,若是block使用不當,很容易致使內存泄漏。

理由:若是block被當前ViewController(self)持有,這時,若是block內部再持有ViewController(self),就會形成循環引用。
解決方案:在block外部弱化self,再在block內部強化已經弱化的weakSelf內存

3、 iOS內存管理

圖片描述
iOS的內存管理機制是:引用計數。MRC基本上已經絕跡,如今主流的仍是ARC。系統的內存分爲棧內存堆內存棧內存是系統管理的,不須要開發者插手,開發者管理的主要是堆內存

當下咱們使用ARC(自動引用計數)進行管理的是堆內存

3.1 內存管理的原則

當咱們使用allocnew建立對象以後,對象的引用計數爲1.
當咱們對對象進行strongcopy操做以後,對象的引用計數+1.
當咱們對對象進行mutableCopy操做以後,生成了一份對象的拷貝,而不是簡單的引用計數+1,這個須要特別注意。
當咱們再也不持有對象時,對象的引用計數-1
當對象的引用計數爲0時,對象會被釋放掉,進行內存的回收。

3.2 須要開發者本身管理的內存

core foundation框架主要提供的是C語言的API,不屬於ARC管理的範疇,因此使用core foundation建立的對象,須要開發者本身進行內存的管理,在對象使用完畢以後進行內存的回收,不然會進行內存的泄漏。

3.3 內存峯值

開發中,對於一些大循環若是把控很差,會出現內存峯值太高的狀況,這個時候咱們須要在循環的內部合理的使用autoreleasepool進行內存峯值的管理。

總結

本文主要是對iOS內存相關的知識點進行了一個概括總結。

  • iOS的內存管理方式爲引用計數,分爲MRCARC
  • 內存泄漏的緣由。
  • 內存溢出的緣由。
  • 內存泄漏的排查方法,靜態排查&動態排查
  • 內存泄漏的常見場景。
  • 內存峯值的管理。
相關文章
相關標籤/搜索