iOS面試復(fù)習1——內(nèi)存

一栖雾、內(nèi)存管理(MRC)

(一) 管理對象

管理對象:OC對象

原因:

? ? ? ? 1楞抡、OC對象存放于堆里面

? ? ? ? 2、非OC對象(int析藕、char召廷、float、double账胧、struct竞慢、enum)一般放在棧里面(棧內(nèi)存會被系統(tǒng)自動回收)


(二) 基本原理

1、每個OC對象內(nèi)部都有4個字節(jié)的存儲空間來存放引用計數(shù)器

2治泥、誰創(chuàng)建誰release :如果你通過alloc筹煮、new或[mutable]copy來創(chuàng)建一個對象(引用計數(shù)+1),那么你必須調(diào)用release或autorelease(引用計數(shù)-1)

3居夹、誰retain誰release:只要你調(diào)用了retain(引用計數(shù)+1)败潦,就必須調(diào)用一次release(引用計數(shù)-1)

4、release并不代表銷毀\回收對象,僅僅是計數(shù)器-1准脂;引用計數(shù)為0時劫扒,對象被銷毀,系統(tǒng)會自動給對象發(fā)送一條dealloc消息意狠。

5粟关、一般來說,除了alloc环戈、new或copy之外的方法創(chuàng)建的對象都被申明了autorelease闷板。


(三) Set方法

- (void) setName:(NSString *)name

{

? ? ? ? if(_name!= name){

? ? ? ? ? ? ? ? [_namerelease];

? ? ? ? ? ? ? ? _name= [name retail];

? ? ? ? }

}


(四) ?一些術(shù)語

1、僵尸對象

已經(jīng)被銷毀的對象(不能再使用的對象)

2院塞、野指針

指向僵尸對象(不可用內(nèi)存)的指針

給野指針發(fā)消息會報EXC_BAD_ACCESS錯誤

3遮晚、空指針

沒有指向存儲空間的指針(里面存的是nil,也就是0)

給空指針發(fā)消息是沒有任何反應(yīng)的

objc_msgSend會通過判斷self來決定是否發(fā)送消息,如果self為nil拦止,那么selector也會為空县遣,直接返回糜颠,所以不會出現(xiàn)問題。視方法返回值萧求,向nil發(fā)消息可能會返回nil(返回值為對象)其兴、0(返回值為一些基礎(chǔ)數(shù)據(jù)類型)或0X0(返回值為id)等。但是對[NSNull null]對象發(fā)送消息時夸政,是會crash的元旬,因為這個NSNull類只有一個null方法


為了避免野指針錯誤的常見辦法

在對象被銷毀之后,將指向?qū)ο蟮闹羔樧優(yōu)榭罩羔?/p>


(五) 一些設(shè)置

1、關(guān)閉ARC功能

Building->AutoMatic Reference Counting->NO

2守问、開啟僵尸對象監(jiān)控

Edit Scheme->Diagnostics->Enable Zombie Object


(六) NSString創(chuàng)建類的幾種方式

NSString類型的字符串有三種方法:

方法1.直接賦值:?? ??NSString?*str1=?@"my string";

方法2.類函數(shù)初始化生成: ? ??NSString?*str2= [NSString stringWithString:@"my string"];

方法3.實例方法初始化生成: NSString?*str3= [[NSString alloc] initWithString:@"my string"];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSString?*str4?=[[NSString?alloc]initWithFormat:@"my string"];


區(qū)別1:方法一生成字符串時,不會初始化內(nèi)存空間,所以使用結(jié)束后不用釋放內(nèi)存;

? ? ? ? ? 而其他三個都會初始化內(nèi)存空間,使用結(jié)束后要釋放內(nèi)存;

? ? ? ? ? 在釋放內(nèi)存時方法2和3也不同,方法2是autorelease類型,內(nèi)存由系統(tǒng)釋放;方法3則必須手動釋放

區(qū)別2:用Format初始化的字符串匀归,需要初始化一段動態(tài)內(nèi)存空間,如:0x6a42a40;

? ? ? ? ? 而用String聲明的字符串耗帕,初始化的是常量內(nèi)存區(qū)穆端,如:0x46a8,常量內(nèi)存區(qū)的地址仿便,只要值相同体啰,占用的 ?地址空間是一致的。

所以str3和str1的地址一致嗽仪,但是str4和str1的地址不一致狡赐。


二、內(nèi)存警告

(一)?app收到Memory Warning后會調(diào)用:

UIApplication::didReceiveMemoryWarning->

UIApplicationDelegate::applicationDidReceiveMemoryWarning,

然后調(diào)用當前所有的viewController進行處理钦幔。

因此處理的主要工作是在viewController枕屉。


(二) 當我們的程序在第一次收到內(nèi)存不足警告時,應(yīng)該釋放一些不用的資源鲤氢,以節(jié)省部分內(nèi)存搀擂。否則,當內(nèi)存不足情形依然存在卷玉,iOS再次向我們程序發(fā)出內(nèi)存不足的警告時哨颂,我們的程序?qū)籭OS kill掉。

1相种、iOS3-iOS5.0以前版本收到內(nèi)存警告:

調(diào)用didReceiveMemoryWarning內(nèi)調(diào)用super的didReceiveMemoryWarning會將controller的view進行釋放威恼。所以我們不能將controller的view再次釋放。

處理方法:

-(void)didReceiveMemoryWarning{

? ? ? ? [super?didReceiveMemoryWarning];//如沒有顯示在window上寝并,會自動將self.view釋放箫措。

? ? ? ? //?ios6.0以前,不用在此做處理衬潦,self.view釋放之后斤蔓,會調(diào)用下面的viewDidUnload函數(shù),在viewDidUnload函數(shù)中做處理就可以了镀岛。

}

-(void)viewDidUnload{

? ? ? ? //?Release?any?retained?subviews?of?the?main?view.不包含self.view

? ? ? ? //處理一些內(nèi)存和資源問題弦牡。?

? ? ? ? [super?viewDidUnload];

}

2友驮、iOS6.0及以上版本的內(nèi)存警告:

調(diào)用didReceiveMemoryWarning內(nèi)調(diào)用super的didReceiveMemoryWarning

只是釋放controller的resouse,不會釋放view

處理方法:

-(void)didReceiveMemoryWarning{

? ? ? ? [super didReceiveMemoryWarning];//即使沒有顯示在window上驾锰,也不會自動的將self.view釋放卸留。

? ? ? ? // Add code to clean up any of yourown resources that are no longer necessary.

? ? ? ? //此處做兼容處理需要加上ios6.0的宏開關(guān),保證是在6.0下使用的,6.0以前屏蔽以下代碼椭豫,否則會在下面使用self.view時自動加載viewDidUnLoad

? ? ? ?if ([[UIDevicecurrentDevice].systemVersion floatValue] >= 6.0) {

? ? ? ? //需要注意的是self.isViewLoaded是必不可少的艾猜,其他方式訪問視圖會導(dǎo)致它加載,在WWDC視頻也忽視這一點捻悯。

? ? ? ? ? ? ? if (self.isViewLoaded &&!self.view.window)//是否是正在使用的視圖{

? ? ? ? ? ? ? ? ? ? ? // Add code to preserve data storedin the views that might be

? ? ? ? ? ? ? ? ? ? ? // needed later.

? ? ? ? ? ? ? ? ? ? ? // Add code to clean up other strongreferences to the view in

? ? ? ? ? ? ? ? ? ? ? // the view hierarchy.

? ? ? ? ? ? ? ? ? ? ? self.view = nil;//目的是再次進入時能夠重新加載調(diào)用viewDidLoad函數(shù)。

? ? ? ? ? ? ? ?}

? ? ? ? }

}

但是似乎這么寫相對于以前并不省事淤毛。最終我們找到一篇文章今缚,文章中說其實并不值得回收這部分的內(nèi)存,原因如下:

1. UIView是UIResponder的子類低淡,而UIResponder有一個CALayer的成員變量姓言,CALayer是具體用于將自己畫到屏幕上的。

2. CALayer是一個bitmap圖象的包裝類蔗蹋,當UIView調(diào)用自身的drawRect時何荚,CALayer才會創(chuàng)建這個bitmap圖象類。

3.具體占內(nèi)存的其實是一個bitmap圖象類猪杭,CALayer只占48bytes, UIView只占96bytes餐塘。而一個iPad的全屏UIView的bitmap類會占到12M的大小皂吮!

4.在iOS6時戒傻,當系統(tǒng)發(fā)出MemoryWarning時,系統(tǒng)會自動回收bitmap類蜂筹。但是不回收UIView和CALayer類需纳。這樣即回收了大部分內(nèi)存,又能在需要bitmap類時艺挪,根據(jù)CALayer類重建不翩。

所以,iOS6這么做的意思是:我們根本沒有必要為了幾十byte而費力回收內(nèi)存麻裳。

生命周期圖

三口蝠、內(nèi)存泄漏分析解決方法

(一) 靜態(tài)分析

通過靜態(tài)分析我們可以最初步的了解到代碼的一些不規(guī)范的地方或者是存在的內(nèi)存泄漏,這是我們第一步對內(nèi)存泄漏的檢測津坑。當然有一些警告并不是我們關(guān)心的可以略過亚皂。

(二) 通過instruments來檢查內(nèi)存泄漏

這個方法能粗略的定位我們在哪里發(fā)生了內(nèi)存泄漏。方法是完成一個循環(huán)操作国瓮,如果內(nèi)存增長為0就證明我們程序在該次循環(huán)操作中不存在內(nèi)存泄漏灭必,如果內(nèi)存增長不為0那證明有可能存在內(nèi)存泄漏狞谱,當然具體問題需要具體分析。

(三) 代碼測試內(nèi)存泄漏

在做這項工作之前我們要注意一下禁漓,在dealloc的方法中我們是否已經(jīng)釋放了該對象所擁有的所有對象跟衅。觀察對象的生成和銷毀是否配對。準確的說就是init(創(chuàng)建對象的方法)和dealloc是否會被成對觸發(fā)(簡單說來就是走一次創(chuàng)建對象就有走一次dealloc該對象)播歼。

四伶跷、內(nèi)存檢查工具

編譯和分析工具Analyze

內(nèi)存泄漏檢測工具—Leak

內(nèi)存猛增檢測工具—Allocations

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秘狞,隨后出現(xiàn)的幾起案子叭莫,更是在濱河造成了極大的恐慌,老刑警劉巖烁试,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雇初,死亡現(xiàn)場離奇詭異,居然都是意外死亡减响,警方通過查閱死者的電腦和手機靖诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支示,“玉大人刊橘,你說我怎么就攤上這事∷毯瑁” “怎么了促绵?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘴纺。 經(jīng)常有香客問我绞愚,道長,這世上最難降的妖魔是什么颖医? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任位衩,我火速辦了婚禮,結(jié)果婚禮上熔萧,老公的妹妹穿的比我還像新娘糖驴。我一直安慰自己,他們只是感情好佛致,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布贮缕。 她就那樣靜靜地躺著,像睡著了一般俺榆。 火紅的嫁衣襯著肌膚如雪感昼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天罐脊,我揣著相機與錄音定嗓,去河邊找鬼蜕琴。 笑死,一個胖子當著我的面吹牛宵溅,可吹牛的內(nèi)容都是我干的凌简。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼恃逻,長吁一口氣:“原來是場噩夢啊……” “哼雏搂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寇损,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凸郑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矛市,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芙沥,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年尘盼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦绳。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡卿捎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出径密,到底是詐尸還是另有隱情午阵,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布享扔,位于F島的核電站底桂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惧眠。R本人自食惡果不足惜籽懦,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛魁。 院中可真熱鬧暮顺,春花似錦、人聲如沸秀存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽或链。三九已至惫恼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澳盐,已是汗流浹背祈纯。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工令宿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盆繁。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓掀淘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親油昂。 傳聞我的和親對象是個殘疾皇子革娄,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • 轉(zhuǎn):http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_偉閱讀 1,315評論 0 3
  • 注:此文章來源:Job_Yang 的簡書 1. Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?Categ...
    廣益散人閱讀 1,350評論 0 13
  • 1.OC里用到集合類是什么拦惋? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,379評論 0 3
  • 我們看過了太多的感動自己的故事言秸,無論是一個動作,無論是一絲問候迎捺,亦或是一句溫柔的話举畸,當輕輕的碰到我們的心靈的一瞬間...
    楊雨樹閱讀 187評論 0 0