iOS內存管理淺析

軟件運行時會分配和使用設備的內存資源,所以,在軟件開發的過程當中,須要進行內存管理,以保證高效、快速的分配內存,而且在適當的時候釋放和回收內存資源。安全

1、Objective-C內存管理的對象

IOS開發中,內存中的對象主要有兩類,一類是值類型,好比int、float、struct等基本數據類型,另外一類是引用類型,也就是繼承自NSObject類的全部的OC對象。前一種值類型不須要咱們管理,後一種引用類型是須要咱們管理內存的,一旦管理很差,就會產生很是糟糕的後果。多線程

爲何值類型不須要管理,而引用類型須要管理呢?那是由於他們分配內存方式不同。框架

值類型會被放入棧中,他們依次緊密排列,在內存中佔有一塊連續的內存空間,遵循先進後出的原則。引用類型會被放到堆中,當給對象分配內存空間時,會隨機的從內存當中開闢空間,對象與對象之間可能會留有不肯定大小的空白空間,所以會產生不少內存碎片,須要咱們管理。性能

棧內存與堆內存從性能上比較,棧內存要優於堆內存,這是由於棧遵循先進後出的原則,所以當數據量過大時,存入棧會明顯的下降性能。所以,咱們會把大量的數據存入堆中,而後棧中存放堆的地址,當須要調用數據時,就能夠快速的經過棧內的地址找到堆中的數據。atom

值類型和引用類型之間是能夠相互轉化的,把值類型轉化爲引用類型的過程叫作裝箱,好比把int包裝爲NSNumber,這個過程會增長程序的運行時間,下降性能。而把引用類型轉爲值類型的過程叫作拆箱,好比把NSNumer轉爲float,在拆箱的過程當中,咱們必定要注意數據原有的類型,若是類型錯誤,可能致使拆箱失敗,所以會存在安全性的問題。手動的拆箱和裝箱,都會增長程序的運行時間,下降代碼可讀性,影響性能。spa

在IOS開發過程當中,棧內存中的值類型系統會自動管理,堆內存中的引用類型是須要咱們管理的。每一個OC對象內部都專門有四個字節來存儲引用計數器,它是一個整數,表示對象被引用的次數,經過它能夠判斷對象是否被回收,若是引用計數爲0,對象回收,不爲0不回收。當對象執行alloc、new或者retain時,引用計數加1,release時,引用計數減1。線程

2、Objective-C管理內存的方式

Objective-c中提供了兩種內存管理機制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),分別提供對內存的手動和自動管理,來知足不一樣的需求。MRC與ARC區別以下圖所示。指針

IOS 內存管理

1.MRC(人工引用計數),手動管理內存。

MRC模式下,全部的對象都須要手動的添加retain、release代碼來管理內存。使用MRC,須要遵照誰建立,誰回收的原則。也就是誰alloc,誰release;誰retain,誰release。對象

當引用計數爲0的時候,必須回收,引用計數不爲0,不能回收,若是引用計數爲0,可是沒有回收,會形成內存泄露。若是引用計數爲0,繼續釋放,會形成野指針。爲了不出現野指針,咱們在釋放的時候,會先讓指針=nil。繼承

2.ARC(自動引用計數),自動管理內存。

ARC是IOS5推出的新功能,經過ARC,能夠自動的管理內存。在ARC模式下,只要沒有強指針(強引用)指向對象,對象就會被釋放。在ARC模式下,不容許使用retain、release、retainCount等方法。而且,若是使用dealloc方法時,不容許調用[super dealloc]方法。

ARC模式下的property變量修飾詞爲strong、weak,至關於MRC模式下的retain、assign。strong :代替retain,缺省關鍵詞,表明強引用。weak:代替assign,聲明瞭一個能夠自動設置nil的弱引用,可是比assign多一個功能,指針指向的地址被釋放以後,指針自己也會自動被釋放。

3、與內存有關的修飾符

strong :強引用,ARC中使用,與MRC中retain相似,使用以後,計數器+1。

weak :弱引用 ,ARC中使用,若是隻想的對象被釋放了,其指向nil,能夠有效的避免野指針,其引用計數爲1。

readwrite : 可讀可寫特性,須要生成getter方法和setter方法時使用。

readonly : 只讀特性,只會生成getter方法 不會生成setter方法,不但願屬性在類外改變。

assign :賦值特性,不涉及引用計數,弱引用,setter方法將傳入參數賦值給實例變量,僅設置變量時使用。

retain :表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1。

copy :表示拷貝特性,setter方法將傳入對象複製一份,須要徹底一份新的變量時。

nonatomic :非原子操做,不加同步,多線程訪問可提升性能,可是線程不安全的。決定編譯器生成的setter getter是不是原子操做。

atomic :原子操做,同步的,表示多線程安全,與nonatomic相反。

4、MRC與ARC混編

MRC與ARC理論上是不能兼容的,也就是你若是建立的項目是ARC模式的,在你的代碼中是不能使用release,不然會出現內存問題。如今大部分程序都會選擇ARC的方式,可是不少第三方的框架是MRC模式,若是想把這些第三方的文件加到本身項目中,須要進行標識,不然編譯的時候會出現錯誤。

在ARC的項目中,對MRC的文件能夠添加編譯選項-fno-objc-arc的標識;在MRC的項目中,對ARC的文件能夠添加編譯選項 -fobjc-arc的標識。 步驟以下圖所示。

IOS 內存管理

把MRC文件轉爲ARC,其實是去掉文件中的retain、release,所以也經過下圖中方式完成。

IOS 內存管理

相關文章
相關標籤/搜索