簡(jiǎn)述內(nèi)存管理基本原則
之前:OC內(nèi)存管理遵循“誰(shuí)創(chuàng)建,誰(shuí)釋放,誰(shuí)引用,誰(shuí)管理”的機(jī)制,當(dāng)創(chuàng)建或引用一個(gè)對(duì)象的時(shí)候,需要向她發(fā)送alloc、copy、retain消息,當(dāng)釋放該對(duì)象時(shí)需要發(fā)送release消息,當(dāng)對(duì)象引用計(jì)數(shù)為0時(shí),系統(tǒng)將釋放該對(duì)象,這是OC的手動(dòng)管理機(jī)制(MRC)。目前:iOS 5.0之后引用自動(dòng)管理機(jī)制——自動(dòng)引用計(jì)數(shù)(ARC),管理機(jī)制與手動(dòng)機(jī)制一樣,只是不再需要調(diào)用retain、release、autorelease;它編譯時(shí)的特性,當(dāng)你使用ARC時(shí),在適當(dāng)位置插入release和autorelease;它引用strong和weak關(guān)鍵字,strong修飾的指針變量指向?qū)ο髸r(shí),當(dāng)指針指向新值或者指針不復(fù)存在,相關(guān)聯(lián)的對(duì)象就會(huì)自動(dòng)釋放,而weak修飾的指針變量指向?qū)ο?,?dāng)對(duì)象的擁有者指向新值或者不存在時(shí)weak修飾的指針會(huì)自動(dòng)置為nil。
內(nèi)存管理的范圍
任何繼承自NSObject的對(duì)象都需要管理內(nèi)存(因存放在堆里面),基本數(shù)據(jù)類型int、float、double、char、結(jié)構(gòu)體struct以及枚舉enum都不需要管理內(nèi)存(因存放在棧里面)
- 堆: 一般由程序員分配釋放內(nèi)存,若程序員不釋放,程序結(jié)束時(shí)可能由OS釋放,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表
- 棧: 由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量值等,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧(先進(jìn)后出)
內(nèi)存管理的概念
定義:高效快速的管理內(nèi)存,在適當(dāng)?shù)臅r(shí)候回收和釋放內(nèi)存資源
MRC中, 使用"引用計(jì)數(shù)機(jī)制", 需要手動(dòng)管理內(nèi)存
ARC中, 使用"強(qiáng)弱引用機(jī)制", 系統(tǒng)自動(dòng)在合適的地方加上retain,release.
常見的引起內(nèi)存泄漏的原因:
循環(huán)引用
大循環(huán)
內(nèi)存管理的幾個(gè)原則是什么?
誰(shuí)創(chuàng)建,誰(shuí)釋放,誰(shuí)引用,誰(shuí)管理
在MRC中,一次retain必須對(duì)應(yīng)一次release消息
在ARC中強(qiáng)弱引用(注意strong / weak關(guān)鍵字)
當(dāng)strong修飾的指針指向新值或者不復(fù)存在時(shí),其相關(guān)聯(lián)的對(duì)象會(huì)自動(dòng)釋放
當(dāng)weak修飾的對(duì)象,其擁有者指向新值或者不復(fù)存在時(shí),weak修飾的對(duì)象會(huì)自動(dòng)置為nil