OC內(nèi)存管理


一個(gè)函數(shù)可以返回棧空間的數(shù)據(jù)毫目,但不能返回椫迓空間的地址


需要加if判斷并free呢撞,修改如下:

  • retain:增加對(duì)象的引用計(jì)數(shù)
QFImage_2016-03-23_14.22.46.png

EXC:exception 異常
ACCESS:訪問(wèn)
EXC_BAD_ACCESS:使用了野指針,即空間已經(jīng)被釋放了条获,但任然使用該指針忠荞。
手動(dòng)內(nèi)存管理原則是:誰(shuí)創(chuàng)建誰(shuí)釋放,誰(shuí)加一誰(shuí)減一;
[pool drain]給自動(dòng)釋放池中的每一個(gè)對(duì)象發(fā)一個(gè)release消息委煤,池中的每個(gè)對(duì)象retainCount都減一
要把一個(gè)對(duì)象(比如dog)放入當(dāng)前環(huán)境中的自動(dòng)釋放池中有兩種方法:
CDDog *dog = [[[CDDog alloc] init]autorelease];
如果使用了自動(dòng)釋放池就不能再進(jìn)行release操作

ARC模式下要正確的使用內(nèi)存最關(guān)鍵的就是書寫正確的和內(nèi)存管理相關(guān)的屬性修飾符

  • strong:對(duì)象指針一般都用strong 表示對(duì)引用計(jì)數(shù)加1堂油,strong是屬性修飾符的默認(rèn)值。除了讓指針指向給定的地址碧绞,還做了對(duì)象引用計(jì)數(shù)
  • weak:如果對(duì)象出現(xiàn)循環(huán)引用的時(shí)候府框,必須用weak
QFImage_2016-03-23_15.23.11.png
QFImage_2016-03-23_15.24.16.png
QFImage_2016-03-23_15.26.26.png
QFImage_2016-03-23_15.32.33.png
QFImage_2016-03-23_15.39.0.png

- 1、出現(xiàn)循環(huán)引用時(shí)候讥邻,有一方必須使用weak迫靖,以破除循環(huán)引用

QFImage_2016-03-23_15.45.13.png
- 2、一個(gè)對(duì)象的生命周期不由你自己的代碼管理兴使,例如可視化編程系宜,要使用weak。
- 3发魄、如果屬性是一個(gè)協(xié)議指針也應(yīng)該使用weak
  • copy:
    • 1盹牧、確保NSString、NSArray励幼、NSDictionary汰寓、NSData等不可變類型指針是確確實(shí)實(shí)指向一個(gè)不可變對(duì)象
    • 2、如果屬性是一個(gè)Block 類型的變量苹粟,必須用copy有滑。
  • assign:
    • 1、基本數(shù)據(jù)類型都用assign嵌削。包括:非對(duì)象指針類型(整形毛好、float、char掷贾、字符型、實(shí)型荣茫、布爾型想帅、枚舉、結(jié)構(gòu)體啡莉、聯(lián)合體)港准。
    • 2、如果屬性是對(duì)象指針咧欣,assign相當(dāng)于weak浅缸。
      不要再C的結(jié)構(gòu)體中使用對(duì)象指針,因?yàn)闊o(wú)法進(jìn)行內(nèi)存管理魄咕。
      自動(dòng)釋放池是可以嵌套的

面試題

1衩椒、說(shuō)說(shuō)對(duì)內(nèi)存管理的理解??

  • 手動(dòng)(MRC):
    • 在創(chuàng)建一個(gè)對(duì)象時(shí)候毛萌,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)對(duì)象的引用計(jì)數(shù)苟弛,并且賦值位1;
    • 當(dāng)引用計(jì)數(shù)為0的時(shí)候阁将,對(duì)象會(huì)去調(diào)用dealloc方法膏秫,以銷毀對(duì)象;
    • 對(duì)象調(diào)用release方法會(huì)讓引用計(jì)數(shù)減一做盅,調(diào)用retain方法讓對(duì)象的引用計(jì)數(shù)加一
  • 自動(dòng)(ARC):
    • 在ARC中管理內(nèi)存的實(shí)質(zhì)還是通過(guò)引用計(jì)數(shù)去管理的缤削,但是程序員不再關(guān)心引用計(jì)數(shù)器的值。在ARC環(huán)境下吹榴,系統(tǒng)會(huì)在程序編譯的時(shí)候會(huì)自動(dòng)在合適的地方添加retain亭敢、release或者autorelease。
    • 當(dāng)強(qiáng)指針指向的時(shí)候腊尚,對(duì)象不銷毀吨拗;弱指針不影響對(duì)象的銷毀;指針默認(rèn)都是強(qiáng)指針婿斥。(ARC中可以重寫dealloc方法劝篷,但絕對(duì)不可以調(diào)用父類的dealloc,在對(duì)象即將被銷毀是調(diào)用dealloc)民宿。
    • _weak 使用這個(gè)關(guān)鍵字修飾的指針是弱指針娇妓;_strong 使用這個(gè)關(guān)鍵字的指針是強(qiáng)指針(默認(rèn)值)

2、手動(dòng)內(nèi)存管理的原則活鹰?
- 程序中如果出現(xiàn)alloc哈恰、retain、new志群、必須配對(duì)出現(xiàn)一個(gè)release或者autorelease着绷;誰(shuí)創(chuàng)建誰(shuí)釋放,誰(shuí)加一誰(shuí)減一锌云,在哪兒創(chuàng)建在哪兒釋放

3荠医、autoReleasePool的原理和autorelease的作用
- autoReleasePool原理:當(dāng)autoReleasePool銷毀時(shí),會(huì)將自動(dòng)釋放池中所有的對(duì)象一次release方法
- autorelease的作用:將對(duì)象放到自動(dòng)釋放池中(并不是寫在自動(dòng)釋放池的大括號(hào)中的對(duì)象就是自動(dòng)釋放池中的對(duì)象)桑涎。release是立刻將計(jì)數(shù)器減1彬向,autorelease的對(duì)象要等autoReleasePool銷毀時(shí)才會(huì)計(jì)數(shù)器減1,即會(huì)延時(shí)銷毀攻冷。也就是autorelease本身不能使計(jì)數(shù)器減1

4娃胆、MRC中符合內(nèi)存管理的set方法的書寫
- 舊值release哟冬、新值retain博投,然后賦值

5、屬性修飾符(strong哥艇、weak、copy招驴、assign篙程、retain)
- strong:控制@property實(shí)現(xiàn)符合內(nèi)存管理的set方法,引用計(jì)數(shù)加1别厘;修飾一般的對(duì)象虱饿。
- weak:控制@property實(shí)現(xiàn)一般的set方法(字節(jié)賦值),只能修飾對(duì)象触趴,用來(lái)避免循環(huán)引用
- copy:控制@property實(shí)現(xiàn)的set方法氮发,會(huì)先創(chuàng)建一個(gè)新的對(duì)象,然后將參數(shù)的值傳給新的對(duì)象冗懦,最后將新的對(duì)象賦給成員變量爽冕。常用來(lái)修飾字符串、數(shù)組披蕉、字典和block颈畸、NSData。
- assign:控制@property實(shí)現(xiàn)一般的set方法(字節(jié)賦值)没讲;常用來(lái)修飾基本數(shù)據(jù)類型int眯娱、float、char爬凑、結(jié)構(gòu)體徙缴、枚舉
- retain:在MRC中,相當(dāng)于strong嘁信,實(shí)現(xiàn)的set方法就是舊值release于样、新值retain

6、內(nèi)存管理的作用:解決內(nèi)存泄露和野指針操作
7潘靖、內(nèi)存管理的原理:分MRC和ARC
8穿剖、一個(gè)工程中只能有一個(gè)自動(dòng)釋放池嗎? 錯(cuò)卦溢,可以NSAutoreleasePool或@autoreleasepool{}去創(chuàng)建多個(gè)自動(dòng)釋放池糊余。
9、在手動(dòng)內(nèi)存管理中既绕,盡量都使用autorelease嗎啄刹?
- 錯(cuò)涮坐,對(duì)象調(diào)用autorelease會(huì)延時(shí)對(duì)象銷毀凄贩,如果所有的對(duì)象都延遲銷毀的話,就相當(dāng)于沒(méi)有做內(nèi)存管理

10袱讹、內(nèi)存分為幾大區(qū)域:
- 棧區(qū):存儲(chǔ)局部變量(包括指向?qū)ο蟮闹羔?疲扎。內(nèi)存分配時(shí)是按照地址從高到低分配的昵时。對(duì)于局部變量而言,如函數(shù)或者代碼塊結(jié)束時(shí)椒丧,系統(tǒng)會(huì)自動(dòng)回收空間壹甥,所以不需要程序員管理
- 堆區(qū):程序運(yùn)行過(guò)程中動(dòng)態(tài)分配的存儲(chǔ)空間,內(nèi)存分配時(shí)是按照地址從低到高分配的壶熏。這是需要程序員管理的那部分句柠,即程序員需要管理任何繼承NSObject的對(duì)象,而對(duì)其他的基本數(shù)據(jù)類型無(wú)效
- BSS段:沒(méi)有初始化的全局變量和靜態(tài)變量棒假。程序啟動(dòng)時(shí)溯职,自動(dòng)加載該空間,所以不需要程序員管理
- 數(shù)據(jù)區(qū):已經(jīng)初始化的全局變量和靜態(tài)變量帽哑、字符串常量谜酒。程序啟動(dòng)時(shí),自動(dòng)加載該空間妻枕,所以不需要程序員管理
- 代碼段:存儲(chǔ)編譯后的代碼僻族。程序啟動(dòng)時(shí),自動(dòng)加載該空間屡谐,所以不需要程序員管理
11述么、引用計(jì)數(shù)器的作用
- 引用計(jì)數(shù)器是判斷對(duì)象要不要回收的依據(jù)。但有一種例外:對(duì)象值為nil康嘉,引用計(jì)數(shù)為碉输,例如:person *p = nil;這個(gè)根本就沒(méi)有創(chuàng)建空間亭珍。retaincount可用%ld 敷钾、%tu來(lái)打印

12、dealloc相關(guān)
- ARC中可以重寫dealloc方法肄梨,但絕對(duì)不可以調(diào)用父類的dealloc阻荒,在對(duì)象即將被銷毀是調(diào)用dealloc.
- 在MRC中,當(dāng)對(duì)象被銷毀時(shí)众羡,系統(tǒng)會(huì)自動(dòng)向?qū)ο蟀l(fā)送一條dealloc消息(程序員可重寫dealloc方法)侨赡,在其中釋放相關(guān)資源,dealloc就像是對(duì)象的臨終遺言粱侣。一旦重寫了dealloc方法羊壹,就必須調(diào)用[super dealloc],并且放在代碼塊的最后調(diào)用齐婴,而不能直接調(diào)用油猫。
- 一旦對(duì)象被回收了,那么他所占據(jù)的存儲(chǔ)空間就不再可用柠偶,堅(jiān)持使用就會(huì)導(dǎo)致程序崩潰情妖,即野指針錯(cuò)誤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睬关,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毡证,更是在濱河造成了極大的恐慌电爹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料睛,死亡現(xiàn)場(chǎng)離奇詭異丐箩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恤煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門雏蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阱州,你說(shuō)我怎么就攤上這事挑秉。” “怎么了苔货?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵犀概,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我夜惭,道長(zhǎng)姻灶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任诈茧,我火速辦了婚禮产喉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敢会。我一直安慰自己曾沈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布鸥昏。 她就那樣靜靜地躺著塞俱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吏垮。 梳的紋絲不亂的頭發(fā)上障涯,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音膳汪,去河邊找鬼唯蝶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遗嗽,可吹牛的內(nèi)容都是我干的粘我。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼媳谁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涂滴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晴音,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柔纵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锤躁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搁料,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年系羞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郭计。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椒振,死狀恐怖昭伸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澎迎,我是刑警寧澤庐杨,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夹供,受9級(jí)特大地震影響灵份,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哮洽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一填渠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸟辅,春花似錦氛什、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至洒缀,卻和暖如春瑰谜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背树绩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工萨脑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饺饭。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓渤早,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘫俊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹊杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • OC內(nèi)存管理一悴灵、基本原理(一)為什么要進(jìn)行內(nèi)存管理。由于移動(dòng)設(shè)備的內(nèi)存極其有限骂蓖,所以每個(gè)APP所占的內(nèi)存也是有限制...
    ScaryMonsterLyn閱讀 516評(píng)論 0 3
  • 29.理解引用計(jì)數(shù) Objective-C語(yǔ)言使用引用計(jì)數(shù)來(lái)管理內(nèi)存积瞒,也就是說(shuō),每個(gè)對(duì)象都有個(gè)可以遞增或遞減的計(jì)數(shù)...
    Code_Ninja閱讀 1,490評(píng)論 1 3
  • OC內(nèi)存管理 一登下、基本原理 (一)為什么要進(jìn)行內(nèi)存管理茫孔。 由于移動(dòng)設(shè)備的內(nèi)存極其有限,所以每個(gè)APP所占的內(nèi)存也是...
    iOS_Developer閱讀 387評(píng)論 0 3
  • 今天看到一篇不錯(cuò)的文章關(guān)于OC內(nèi)存管理的,轉(zhuǎn)載一下與你共享概述我們知道在程序運(yùn)行過(guò)程中要?jiǎng)?chuàng)建大量的對(duì)象被芳,和其他高級(jí)...
    niceSYT閱讀 452評(píng)論 0 2
  • 日課34:談?wù)勀銓?duì)世界的三個(gè)層級(jí)的看法缰贝。 參考書目:《你的生命有什么可能》 一個(gè)決策中最有價(jià)值的,不是做或不做的結(jié)...
    Leice閱讀 534評(píng)論 0 1