iOS內(nèi)存管理基礎(chǔ)

軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的內(nèi)存資源香到,因此露筒,在軟件開發(fā)的過程中醇王,需要進(jìn)行內(nèi)存管理朵你,以保證高效、快速的分配內(nèi)存,并且在適當(dāng)?shù)臅r(shí)候釋放和回收內(nèi)存資源她渴。

一达址、Objective-C內(nèi)存管理的對(duì)象

IOS開發(fā)中,內(nèi)存中的對(duì)象主要有兩類惹骂,一類是值類型苏携,比如int、float对粪、struct等基本數(shù)據(jù)類型右冻,另一類是引用類型,也就是繼承自NSObject類的所有的OC對(duì)象著拭。前一種值類型不需要我們管理纱扭,后一種引用類型是需要我們管理內(nèi)存的,一旦管理不好儡遮,就會(huì)產(chǎn)生非常糟糕的后果乳蛾。

為什么值類型不需要管理,而引用類型需要管理呢鄙币?那是因?yàn)樗麄兎峙鋬?nèi)存方式不一樣肃叶。

值類型會(huì)被放入棧中,他們依次緊密排列十嘿,在內(nèi)存中占有一塊連續(xù)的內(nèi)存空間因惭,遵循先進(jìn)后出的原則。引用類型會(huì)被放到堆中绩衷,當(dāng)給對(duì)象分配內(nèi)存空間時(shí)蹦魔,會(huì)隨機(jī)的從內(nèi)存當(dāng)中開辟空間,對(duì)象與對(duì)象之間可能會(huì)留有不確定大小的空白空間咳燕,因此會(huì)產(chǎn)生很多內(nèi)存碎片勿决,需要我們管理。

棧內(nèi)存與堆內(nèi)存從性能上比較招盲,棧內(nèi)存要優(yōu)于堆內(nèi)存低缩,這是因?yàn)闂W裱冗M(jìn)后出的原則,因此當(dāng)數(shù)據(jù)量過大時(shí)曹货,存入棧會(huì)明顯的降低性能咆繁。因此,我們會(huì)把大量的數(shù)據(jù)存入堆中控乾,然后棧中存放堆的地址么介,當(dāng)需要調(diào)用數(shù)據(jù)時(shí)娜遵,就可以快速的通過棧內(nèi)的地址找到堆中的數(shù)據(jù)蜕衡。

值類型和引用類型之間是可以相互轉(zhuǎn)化的,把值類型轉(zhuǎn)化為引用類型的過程叫做裝箱,比如把int包裝為NSNumber慨仿,這個(gè)過程會(huì)增加程序的運(yùn)行時(shí)間久脯,降低性能。而把引用類型轉(zhuǎn)為值類型的過程叫做拆箱镰吆,比如把NSNumer轉(zhuǎn)為float帘撰,在拆箱的過程中,我們一定要注意數(shù)據(jù)原有的類型万皿,如果類型錯(cuò)誤摧找,可能導(dǎo)致拆箱失敗,因此會(huì)存在安全性的問題牢硅。手動(dòng)的拆箱和裝箱蹬耘,都會(huì)增加程序的運(yùn)行時(shí)間,降低代碼可讀性减余,影響性能综苔。

在IOS開發(fā)過程中,棧內(nèi)存中的值類型系統(tǒng)會(huì)自動(dòng)管理位岔,堆內(nèi)存中的引用類型是需要我們管理的如筛。每個(gè)OC對(duì)象內(nèi)部都專門有四個(gè)字節(jié)來存儲(chǔ)引用計(jì)數(shù)器,它是一個(gè)整數(shù)抒抬,表示對(duì)象被引用的次數(shù)杨刨,通過它可以判斷對(duì)象是否被回收,如果引用計(jì)數(shù)為0瞧剖,對(duì)象回收拭嫁,不為0不回收。當(dāng)對(duì)象執(zhí)行alloc抓于、new或者retain時(shí)做粤,引用計(jì)數(shù)加1,release時(shí)捉撮,引用計(jì)數(shù)減1怕品。

二、Objective-C管理內(nèi)存的方式

Objective-c中提供了兩種內(nèi)存管理機(jī)制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting)巾遭,分別提供對(duì)內(nèi)存的手動(dòng)和自動(dòng)管理肉康,來滿足不同的需求。MRC與ARC區(qū)別如下圖所示灼舍。

IOS 內(nèi)存管理

1.MRC(人工引用計(jì)數(shù))吼和,手動(dòng)管理內(nèi)存。

MRC模式下骑素,所有的對(duì)象都需要手動(dòng)的添加retain炫乓、release代碼來管理內(nèi)存。使用MRC,需要遵守誰創(chuàng)建末捣,誰回收的原則侠姑。也就是誰alloc,誰release箩做;誰retain莽红,誰release。

當(dāng)引用計(jì)數(shù)為0的時(shí)候邦邦,必須回收安吁,引用計(jì)數(shù)不為0,不能回收燃辖,如果引用計(jì)數(shù)為0柳畔,但是沒有回收,會(huì)造成內(nèi)存泄露郭赐。如果引用計(jì)數(shù)為0薪韩,繼續(xù)釋放,會(huì)造成野指針捌锭。為了避免出現(xiàn)野指針俘陷,我們?cè)卺尫诺臅r(shí)候,會(huì)先讓指針=nil观谦。

2.ARC(自動(dòng)引用計(jì)數(shù))拉盾,自動(dòng)管理內(nèi)存。

ARC是IOS5推出的新功能豁状,通過ARC捉偏,可以自動(dòng)的管理內(nèi)存。在ARC模式下泻红,只要沒有強(qiáng)指針(強(qiáng)引用)指向?qū)ο筘睬荩瑢?duì)象就會(huì)被釋放。在ARC模式下谊路,不允許使用retain讹躯、release、retainCount等方法缠劝。并且潮梯,如果使用dealloc方法時(shí),不允許調(diào)用[super dealloc]方法惨恭。

ARC模式下的property變量修飾詞為strong秉馏、weak,相當(dāng)于MRC模式下的retain脱羡、assign萝究。strong :代替retain母廷,缺省關(guān)鍵詞,代表強(qiáng)引用糊肤。weak:代替assign,聲明了一個(gè)可以自動(dòng)設(shè)置nil的弱引用氓鄙,但是比assign多一個(gè)功能馆揉,指針指向的地址被釋放之后,指針本身也會(huì)自動(dòng)被釋放抖拦。

三升酣、與內(nèi)存有關(guān)的修飾符

strong :強(qiáng)引用,ARC中使用态罪,與MRC中retain類似噩茄,使用之后,計(jì)數(shù)器+1复颈。

weak :弱引用 绩聘,ARC中使用,如果只想的對(duì)象被釋放了耗啦,其指向nil凿菩,可以有效的避免野指針,其引用計(jì)數(shù)為1帜讲。

readwrite : 可讀可寫特性衅谷,需要生成getter方法和setter方法時(shí)使用。

readonly : 只讀特性似将,只會(huì)生成getter方法 不會(huì)生成setter方法获黔,不希望屬性在類外改變。

assign :賦值特性在验,不涉及引用計(jì)數(shù)玷氏,弱引用,setter方法將傳入?yún)?shù)賦值給實(shí)例變量腋舌,僅設(shè)置變量時(shí)使用预茄。

retain :表示持有特性,setter方法將傳入?yún)?shù)先保留侦厚,再賦值耻陕,傳入?yún)?shù)的retaincount會(huì)+1。

copy :表示拷貝特性刨沦,setter方法將傳入對(duì)象復(fù)制一份诗宣,需要完全一份新的變量時(shí)。

nonatomic :非原子操作想诅,不加同步召庞,多線程訪問可提高性能岛心,但是線程不安全的。決定編譯器生成的setter getter是否是原子操作篮灼。

atomic :原子操作忘古,同步的,表示多線程安全诅诱,與nonatomic相反髓堪。

四、MRC與ARC混編

MRC與ARC理論上是不能兼容的娘荡,也就是你如果創(chuàng)建的項(xiàng)目是ARC模式的干旁,在你的代碼中是不能使用release,否則會(huì)出現(xiàn)內(nèi)存問題∨阢澹現(xiàn)在大部分程序都會(huì)選擇ARC的方式争群,但是很多第三方的框架是MRC模式,如果想把這些第三方的文件加到自己項(xiàng)目中大年,需要進(jìn)行標(biāo)識(shí)换薄,否則編譯的時(shí)候會(huì)出現(xiàn)錯(cuò)誤。

在ARC的項(xiàng)目中翔试,對(duì)MRC的文件可以添加編譯選項(xiàng)-fno-objc-arc的標(biāo)識(shí)专控;在MRC的項(xiàng)目中,對(duì)ARC的文件可以添加編譯選項(xiàng) -fobjc-arc的標(biāo)識(shí)遏餐。 步驟如下圖所示伦腐。

IOS 內(nèi)存管理

把MRC文件轉(zhuǎn)為ARC,實(shí)際上是去掉文件中的retain失都、release柏蘑,因此也通過下圖中方式完成。


原文出處:http://www.reibang.com/p/66b5d43b6ac4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粹庞,一起剝皮案震驚了整個(gè)濱河市咳焚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庞溜,老刑警劉巖革半,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異流码,居然都是意外死亡又官,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門漫试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來六敬,“玉大人,你說我怎么就攤上這事驾荣⊥夤梗” “怎么了普泡?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)审编。 經(jīng)常有香客問我撼班,道長(zhǎng),這世上最難降的妖魔是什么垒酬? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任砰嘁,我火速辦了婚禮,結(jié)果婚禮上伤溉,老公的妹妹穿的比我還像新娘。我一直安慰自己妻率,他們只是感情好乱顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宫静,像睡著了一般走净。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孤里,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天伏伯,我揣著相機(jī)與錄音,去河邊找鬼捌袜。 笑死说搅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虏等。 我是一名探鬼主播弄唧,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霍衫!你這毒婦竟也來了候引?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤敦跌,失蹤者是張志新(化名)和其女友劉穎澄干,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠傍,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡麸俘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惧笛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾掰。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徐紧,靈堂內(nèi)的尸體忽然破棺而出静檬,到底是詐尸還是另有隱情炭懊,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布拂檩,位于F島的核電站侮腹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稻励。R本人自食惡果不足惜父阻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望望抽。 院中可真熱鬧加矛,春花似錦、人聲如沸煤篙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辑奈。三九已至苛茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸠窗,已是汗流浹背妓羊。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稍计,地道東北人躁绸。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臣嚣,于是被迫代替她去往敵國和親涨颜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一茧球、Object C中內(nèi)存管理的對(duì)象 在iOS開發(fā)中庭瑰,內(nèi)存中的對(duì)象有兩類,一類是值類型抢埋,例如:init弹灭、float...
    淺淺的說07閱讀 169評(píng)論 0 0
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release揪垄,為什么穷吮?需要與a...
    丶逐漸閱讀 1,950評(píng)論 1 16
  • 內(nèi)存管理的基本范圍和概念. 程序運(yùn)行過程中藥創(chuàng)建大量的對(duì)象, 和其他高級(jí)語言類似,在ObjC中對(duì)象存儲(chǔ)在堆區(qū),程序...
    ValienZh閱讀 878評(píng)論 0 2
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,704評(píng)論 8 119
  • 數(shù)著時(shí)間 一點(diǎn)一點(diǎn) 越來越近 越來越遠(yuǎn) 世界安靜 心在失眠 你的敷衍 太過明顯 沒人在聽 別太較真
    章可可閱讀 113評(píng)論 0 0