內(nèi)存管理總結(jié)

1.內(nèi)存區(qū)域

1>堆和棧的區(qū)別

管理方式:對(duì)于棧來(lái)講矛物,是由編譯器自動(dòng)管理,無(wú)需我們手工控制跪但;對(duì)于堆來(lái)說(shuō)履羞,釋放工作由程序員控制,容易產(chǎn)生memory leak屡久。

申請(qǐng)大幸涫住:

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域被环。這句話(huà)的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的糙及,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M筛欢,總之是一個(gè)編譯時(shí)就確定的常數(shù))浸锨,如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow版姑。因此柱搜,能從棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)剥险,是不連續(xù)的內(nèi)存區(qū)域聪蘸。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址健爬。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存控乾。由此可見(jiàn),堆獲得的空間比較靈活浑劳,也比較大阱持。

碎片問(wèn)題:

對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù)魔熏,從而造成大量的碎片衷咽,使程序效率降低。對(duì)于棧來(lái)講蒜绽,則不會(huì)存在這個(gè)問(wèn)題镶骗,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng)躲雅,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出

分配方式:

堆都是動(dòng)態(tài)分配的鼎姊,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配相赁。靜態(tài)分配是編譯器完成的相寇,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配钮科,但是棧的動(dòng)態(tài)分配和堆是不同的唤衫,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)绵脯。

分配效率:

棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)佳励,計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專(zhuān)門(mén)的寄存器存放棧的地址,壓棧出棧都有專(zhuān)門(mén)的指令執(zhí)行蛆挫,這就決定了棧的效率比較高赃承。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的悴侵。

2.iOS內(nèi)存管理

1> 字符串的內(nèi)存管理

創(chuàng)建字符串的內(nèi)存空間??堆? 常量區(qū)

2> 循環(huán)引用

delegate屬性的內(nèi)存策略

block循環(huán)引用???實(shí)際場(chǎng)景

3> autorelease的使用?? 工廠方法為什么不釋放對(duì)象??ARC下autorelease的使用場(chǎng)景

避免內(nèi)存峰值

SDWebimage中加載gif圖片??大循環(huán)

棧結(jié)構(gòu) 棧頂

統(tǒng)一發(fā)release消息

4> ARC和MRC的混用

4.1> MRC>ARC

把MRC的代碼轉(zhuǎn)換成ARC的代碼瞧剖,刪除內(nèi)存管理操作(手動(dòng))

xcode提供了自動(dòng)將MRC轉(zhuǎn)換成ARC的功能,操作菜單欄edit -> Refacotor(重構(gòu)) -> Convert to Objective-C ARC

4.2> ARC>MRC

在ARC項(xiàng)目中繼續(xù)使用MRC編譯的類(lèi)可免,在編譯選項(xiàng)中標(biāo)識(shí)MRC文件即可"-fno-objc-arc"

在MRC項(xiàng)目中繼續(xù)使用ARC編譯的類(lèi)在編譯選項(xiàng)中標(biāo)識(shí)MRC文件即可"-fobjc-arc"

3.跨平臺(tái)

3> OC和C框架對(duì)象引用

oc和c 橋接 三個(gè)橋接關(guān)鍵字都是干么的 __bridge??不更改歸屬權(quán)??__bridge_transfer 所有權(quán)給OC?? __bridge_retain 解除OC的所有權(quán)

ios5/6/7/8 內(nèi)存方面的區(qū)別

ios5.自動(dòng)引用計(jì)數(shù)?(ARC)

ios6.UICollectionView?( 內(nèi)存重用機(jī)制筒繁,圖片展示瀑布流實(shí)現(xiàn) )??在didReceiveMemoryWarning中處理內(nèi)存(6之前在ViewDidUnload中)http://blog.csdn.net/likendsl/article/details/8199350

ios7.iOS7以后強(qiáng)制使用ARC

ios8

4、性能優(yōu)化

#warning 繼續(xù)優(yōu)化

怎么保證多人開(kāi)發(fā)進(jìn)行內(nèi)存泄露的檢查.

使用Analyze進(jìn)行代碼的靜態(tài)分析

為避免不必要的麻煩,多人開(kāi)發(fā)時(shí)盡量使用ARC

2.非自動(dòng)內(nèi)存管理情況下怎么做單例模式.

創(chuàng)建單例設(shè)計(jì)模式的基本步驟·

>聲明一個(gè)單件對(duì)象的靜態(tài)實(shí)例,并初始化為nil巴元。

>創(chuàng)建一個(gè)類(lèi)的類(lèi)工廠方法,當(dāng)且僅當(dāng)這個(gè)類(lèi)的實(shí)例為nil時(shí)生成一個(gè)該類(lèi)的實(shí)例

>實(shí)現(xiàn)NScopying協(xié)議,覆蓋allocWithZone:方法,確保用戶(hù)在直接分配和初始化對(duì)象時(shí),不會(huì)產(chǎn)生另一個(gè)對(duì)象毡咏。

>覆蓋release、autorelease逮刨、retain呕缭、retainCount方法,以此確保單例的狀態(tài)堵泽。

>在多線(xiàn)程的環(huán)境中,注意使用@synchronized關(guān)鍵字或GCD,確保靜態(tài)實(shí)例被正確的創(chuàng)建和初始化。

3.對(duì)于類(lèi)方法(靜態(tài)方法)默認(rèn)是autorelease的恢总。所有類(lèi)方法都會(huì)這樣嗎迎罗?

1>系統(tǒng)自帶的絕大數(shù)類(lèi)方法返回的對(duì)象,都是經(jīng)過(guò)autorelease的

4.block在ARC中和MRC中的用法有什么區(qū)別,需要注意什么

1.對(duì)于沒(méi)有引用外部變量的Block,無(wú)論在ARC還是非ARC下片仿,類(lèi)型都是__NSGlobalBlock__纹安,這種類(lèi)型的block可以理解成一種全局的block,不需要考慮作用域問(wèn)題砂豌。同時(shí)厢岂,對(duì)他進(jìn)行Copy或者Retain操作也是無(wú)效的

2.應(yīng)注意避免循環(huán)引用

5.什么情況下會(huì)發(fā)生內(nèi)存泄漏和內(nèi)存溢出?

當(dāng)程序在申請(qǐng)內(nèi)存后阳距,無(wú)法釋放已申請(qǐng)的內(nèi)存空間(例如一個(gè)對(duì)象或者變量使用完成后沒(méi)有釋放,這個(gè)對(duì)象一直占用著內(nèi)存)塔粒,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很?chē)?yán)重筐摘,無(wú)論多少內(nèi)存,遲早會(huì)被占光卒茬。內(nèi)存泄露會(huì)最終會(huì)導(dǎo)致內(nèi)存溢出!

當(dāng)程序在申請(qǐng)內(nèi)存時(shí)咖熟,沒(méi)有足夠的內(nèi)存空間供其使用圃酵,出現(xiàn)out of memory;比如申請(qǐng)了一個(gè)int,但給它存了long才能存下的數(shù)馍管,那就是內(nèi)存溢出郭赐。

6.[NSArray arrayWithobject:]這個(gè)方法添加對(duì)象后,需要對(duì)這個(gè)數(shù)組做釋放操作嗎咽斧?

不需要這個(gè)對(duì)象被放到自動(dòng)釋放池中

7.Json數(shù)據(jù)的解析堪置,和解析數(shù)據(jù)的時(shí)候有內(nèi)存泄露嗎躬存?有的話(huà)如何解

JSON解析的方案

SBJson

JSONkit

NSJSONSerialization

內(nèi)存泄漏么?

8.自動(dòng)釋放池底層怎么實(shí)現(xiàn)

自動(dòng)釋放池以棧的形式實(shí)現(xiàn):當(dāng)你創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí)张惹,它將被添加到棧頂。當(dāng)一個(gè)對(duì)象收到發(fā)送autorelease消息時(shí),它被添加到當(dāng)前線(xiàn)程的處于棧頂?shù)淖詣?dòng)釋放池中,當(dāng)自動(dòng)釋放池被回收時(shí),它們從棧中被刪除,并且會(huì)給池子里面所有的對(duì)象都會(huì)做一次release操作.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岭洲,一起剝皮案震驚了整個(gè)濱河市宛逗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盾剩,老刑警劉巖雷激,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異告私,居然都是意外死亡屎暇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)驻粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)根悼,“玉大人,你說(shuō)我怎么就攤上這事〖费玻” “怎么了剩彬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矿卑。 經(jīng)常有香客問(wèn)我喉恋,道長(zhǎng),這世上最難降的妖魔是什么母廷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任轻黑,我火速辦了婚禮,結(jié)果婚禮上徘意,老公的妹妹穿的比我還像新娘苔悦。我一直安慰自己,他們只是感情好椎咧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布玖详。 她就那樣靜靜地躺著,像睡著了一般勤讽。 火紅的嫁衣襯著肌膚如雪蟋座。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天脚牍,我揣著相機(jī)與錄音向臀,去河邊找鬼。 笑死诸狭,一個(gè)胖子當(dāng)著我的面吹牛券膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驯遇,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芹彬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叉庐?” 一聲冷哼從身側(cè)響起舒帮,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陡叠,沒(méi)想到半個(gè)月后玩郊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉阵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年译红,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兴溜。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侦厚,死狀恐怖反璃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情假夺,我是刑警寧澤淮蜈,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站已卷,受9級(jí)特大地震影響梧田,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侧蘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一裁眯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讳癌,春花似錦穿稳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骤菠,卻和暖如春它改,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背商乎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工央拖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹉戚。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓鲜戒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抹凳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遏餐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release却桶,為什么境输?需要與a...
    丶逐漸閱讀 1,950評(píng)論 1 16
  • 11.看下面的程序,第一個(gè)NSLog會(huì)輸出什么蔗牡?這時(shí)str的retainCount是多少颖系?第二個(gè)和第三個(gè)呢? 為什...
    AlanGe閱讀 721評(píng)論 1 4
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,701評(píng)論 8 119
  • 為什么進(jìn)行內(nèi)存管理辩越? 由于移動(dòng)設(shè)備的內(nèi)存極其有限嘁扼,所以每個(gè)APP所占的內(nèi)存也是有限制的,當(dāng)app所占用的內(nèi)存較多時(shí)...
    天天想念閱讀 889評(píng)論 1 7
  • 產(chǎn)品設(shè)計(jì)里為什么要知道商業(yè)和需求黔攒?因?yàn)楫a(chǎn)品是重大的商業(yè)邏輯里的一環(huán)趁啸,想做一個(gè)合格的產(chǎn)品設(shè)計(jì)師强缘,必須要了解商業(yè)邏輯。...
    木子水兒閱讀 390評(píng)論 0 0