IOS 內(nèi)存管理

轉(zhuǎn)自iOS經(jīng)典面試題總結(jié)--內(nèi)存管理 - CocoaChina_讓移動開發(fā)更簡單

內(nèi)存管理

1.什么是ARC师郑?

ARC是automatic reference counting自動引用計數(shù)芦疏,在程序編譯時自動加入retain/release。在對象被創(chuàng)建時retain count+1执泰,在對象被release時count-1,當(dāng)count=0時哩陕,銷毀對象澈侠。程序中加入autoreleasepool對象會由系統(tǒng)自動加上autorelease方法,如果該對象引用計數(shù)為0铅辞,則銷毀厌漂。那么ARC是為了解決MRC手動管理內(nèi)存存在的一些而誕生的。

MRC下內(nèi)存管理的缺點:

釋放一個堆內(nèi)存時斟珊,首先要確定指向這個堆空間的指針都被release了苇倡。(避免提前釋放)

釋放指針指向的堆空間,首先要確定哪些指向同一個堆囤踩,這些指針只能釋放一次旨椒。(避免釋放多次,造成內(nèi)存泄露)

模塊化操作時堵漱,對象可能被多個模塊創(chuàng)建和使用综慎,不能確定最后由誰釋放

多線程操作時,不確定哪個線程最后使用完畢勤庐。

雖然ARC給我們編程帶來的很多好多示惊,但也可能出現(xiàn)內(nèi)存泄露。如下面兩種情況:

循環(huán)參照:A有個屬性參照B愉镰,B有個屬性參照A米罚,如果都是strong參照的話,兩個對象都無法釋放丈探。

死循環(huán):如果有個ViewController中有無限循環(huán)录择,也會導(dǎo)致即使ViewController對應(yīng)的view消失了,ViewController也不能釋放碗降。

2.block一般用那個關(guān)鍵字修飾隘竭,為什么?

block一般使用copy關(guān)鍵之進(jìn)行修飾讼渊,block使用copy是從MRC遺留下來的“傳統(tǒng)”动看,在MRC中,方法內(nèi)容的block是在棧區(qū)的精偿,使用copy可以把它放到堆區(qū)弧圆。但在ARC中寫不寫都行:編譯器自動對block進(jìn)行了copy操作。

3.用@property聲明的NSString(或NSArray笔咽,NSDictionary)經(jīng)常使用copy關(guān)鍵字搔预,為什么?如果改用strong關(guān)鍵字叶组,可能造成什么問題拯田?

答:用@property聲明 NSString、NSArray甩十、NSDictionary 經(jīng)常使用copy關(guān)鍵字船庇,是因為他們有對應(yīng)的可變類型:NSMutableString吭产、NSMutableArray、NSMutableDictionary鸭轮,他們之間可能進(jìn)行賦值操作臣淤,為確保對象中的字符串值不會無意間變動,應(yīng)該在設(shè)置新屬性值時拷貝一份窃爷。

如果我們使用是strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性邑蒋。

copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值按厘,而是將其“拷貝” (copy)医吊。 當(dāng)屬性類型為NSString時,經(jīng)常用此特質(zhì)來保護(hù)其封裝性逮京,因為傳遞給設(shè)置方法的新值有可能指向一個NSMutableString類的實例卿堂。這個類是NSString的子類,表示一種可修改其值的字符串懒棉,此時若是不拷貝字符串草描,那么設(shè)置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改策严。所以陶珠,這時就要拷貝一份“不可變” (immutable)的字符串,確保對象中的字符串值不會無意間變動享钞。只要實現(xiàn)屬性所用的對象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時拷貝一份诀蓉。

4.runloop栗竖、autorelease pool以及線程之間的關(guān)系。

每個線程(包含主線程)都有一個Runloop渠啤。對于每一個Runloop狐肢,系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構(gòu)成一個像callstack一樣的一個棧式結(jié)構(gòu)沥曹,在每一個Runloop結(jié)束時份名,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀,這樣這個pool里的每個Object會被release妓美。

5.@property 的本質(zhì)是什么僵腺?ivar、getter壶栋、setter 是如何生成并添加到這個類中的辰如。

“屬性”(property)有兩大概念:ivar(實例變量)、存取方法(access method=getter)贵试,即@property = ivar + getter + setter琉兜。

例如下面的這個類:

@interface?WBTextView?:UITextView

@property?(nonatomic,copy)NSString?*placehold;

@property?(nonatomic,copy)UIColor?*placeholdColor;

@end

類完成屬性的定以后凯正,編譯器會自動編寫訪問這些屬性的方法(自動合成autosynthesis),上述代碼寫出來的類等效與下面的代碼:

@interface?WBTextView?:UITextView

-?(NSString?*)placehold;

-(void)setPlacehold:(NSString?*)placehold;

-(UIColor?*)placeholdColor;

-(void)setPlaceholdColor:(UIColor?*)placeholdColor;

@end

詳細(xì)介紹見:http://blog.csdn.net/jasonjwl/article/details/49427377

6.分別寫一個setter方法用于完成@property (nonatomic,retain)NSString *name和@property (nonatomic,copy) NSString *name

retain屬性的setter方法是保留新值并釋放舊值豌蟋,然后更新實例變量廊散,令其指向新值。順序很重要梧疲。假如還未保留新值就先把舊值釋放了允睹,而且兩個值又指向同一個對象,先執(zhí)行的release操作就可能導(dǎo)致系統(tǒng)將此對象永久回收往声。

-(void)setName:(NSString?*)name

{

[name?retain];

[_name?release];

_name?=?name;

}

-(void)setName:(NSString?*)name

{

[_name?release];

_name?=?[name?copy];

}

7.說說assign vs weak擂找,_block vs _weak的區(qū)別

assign適用于基本數(shù)據(jù)類型,weak是適用于NSObject對象浩销,并且是一個弱引用贯涎。

assign其實頁可以用來修飾對象,那么為什么不用它呢慢洋?因為被assign修飾的對象在釋放之后塘雳,指針的地址還是存在的,也就是說指針并沒有被置為nil普筹。如果在后續(xù)內(nèi)存分配中败明,剛才分到了這塊地址,程序就會崩潰掉太防。而weak修飾的對象在釋放之后妻顶,指針地址會被置為nil。

_block是用來修飾一個變量蜒车,這個變量就可以在block中被修改讳嘱。

_block:使用_block修飾的變量在block代碼塊中會被retain(ARC下,MRC下不會retain)

_weak:使用_weak修飾的變量不會在block代碼塊中被retain

8.請說出下面代碼是否有問題酿愧,如果有問題請修改沥潭?

@autoreleasepool?{

for(int?i=0;?i[largeNumber;?i++)?{?(因識別問題,該行代碼中尖括號改為方括號代替)

Person?*per?=?[[Person?alloc]?init];

[per?autorelease];

}

}

內(nèi)存管理的原則:如果對一個對象使用了alloc嬉挡、copy钝鸽、retain,那么你必須使用相應(yīng)的release或者autorelease庞钢。咋一看拔恰,這道題目有alloc,也有autorelease焊夸,兩者對應(yīng)起來仁连,應(yīng)該沒問題。但autorelease雖然會使引用計數(shù)減一,但是它并不是立即減一饭冬,它的本質(zhì)功能只是把對象放到離他最近的自動釋放池里使鹅。當(dāng)自動釋放池銷毀了,才會向自動釋放池中的每一個對象發(fā)送release消息昌抠。這道題的問題就在autorelease患朱。因為largeNumber是一個很大的數(shù),autorelease又不能使引用計數(shù)立即減一炊苫,所以在循環(huán)結(jié)束前會造成內(nèi)存溢出的問題裁厅。

解決方案如下:

@autoreleasepool?{

for(int?i=0;?i[100000;?i++)?{?(因識別問題,該行代碼中尖括號改為方括號代替)

@autoreleasepool?{

Person?*per?=?[[Person?alloc]?init];

[per?autorelease];

}

}

}

在循環(huán)內(nèi)部再加一個自動釋放池侨艾,這樣就能保證每創(chuàng)建一個對象就能及時釋放执虹。

9.請問下面代碼是否有問題,如有問題請修改唠梨?

@autoreleasepool?{

NSString?*str?=?[[NSString?alloc]?init];

[str?retain];

[str?retain];

str?=?@"jxl";

[str?release];

[str?release];

[str?release];

}

這道題跟第8題一樣存在內(nèi)存泄露問題袋励,1.內(nèi)存泄露 2.指向常量區(qū)的對象不能release。

指針變量str原本指向一塊開辟的堆區(qū)空間当叭,但是經(jīng)過重新給str賦值茬故,str的指向發(fā)生了變化,由原來指向堆區(qū)空間蚁鳖,到指向常量區(qū)磺芭。常量區(qū)的變量根本不需要釋放,這就導(dǎo)致了原來開辟的堆區(qū)空間沒有釋放醉箕,照成內(nèi)存泄露钾腺。

10.什么情況下使用weak關(guān)鍵字,相比assign有什么不同讥裤?什么情況使用weak關(guān)鍵字垮庐?

在ARC中,在有可能出現(xiàn)循環(huán)引用的時候坞琴,往往要通過讓其中一端使用weak來解決。比如delegate代理

自身已經(jīng)對它進(jìn)行一次強引用逗抑,沒有必要再強引用一次剧辐,此時也會使用weak,自定義控件屬性一般也使用weak邮府。

不同點:

weak此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”荧关。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值褂傀,也不釋放舊值忍啤。此特性與assign一樣,然而在屬性所指的對象遭到推毀時,屬性值也會清空同波。而assign的“設(shè)置方法”只會執(zhí)行針對“純量類型” (scalar type鳄梅,例如 CGFloat 或 NSlnteger 等)的簡單賦值操作。

assign可以用非OC對象未檩,而weak必須用于OC對象戴尸。

11.內(nèi)存管理語義(assign、strong冤狡、weak等的區(qū)別)

assign “設(shè)置方法” 只會執(zhí)行針對“純量”的簡單賦值操作孙蒙。

strong ?此特質(zhì)表明該屬性定義了一種“擁有關(guān)系”。為這種屬性設(shè)置新值時悲雳,設(shè)置方法會先保留新值挎峦,并釋放舊值,然后再將新值設(shè)置上去合瓢。

weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”坦胶。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值歪玲,也不釋放舊值迁央。此特質(zhì)同assign類似,然而在屬性所指的對象遭到推毀時滥崩,屬性值也會清空岖圈。

unsafe_unretained ?此特質(zhì)的語義和assign相同,但是它適用于“對象類型”钙皮,該特質(zhì)表達(dá)一種“非擁有關(guān)系”蜂科,當(dāng)目標(biāo)對象遭到推毀時,屬性值不會自動清空,這一點與weak有區(qū)別塔淤。

copy 此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似屏镊。然而設(shè)置方法并不保留新值,而是設(shè)置方法并不保留新值贡定,而是將其“拷貝”。當(dāng)屬性類型為NSString*時可都,經(jīng)常用此特質(zhì)來保護(hù)其封裝性缓待,因為傳遞給設(shè)置方法的新值有可能指向一個NSMutableString類的實例。這個類是NSString的子類渠牲,表示一種可以修改其值的字符串旋炒,此時若是不拷貝字符串,那么設(shè)置完屬性之后签杈,字符串的值就可能會在對象不知情的情況下遭人更改瘫镇。所以,這時就要拷貝一份“不可變”的字符串,確保對象中的字符串值不會無意間變動铣除。只要實現(xiàn)屬性所用的對象是“可變的”谚咬,就應(yīng)該在設(shè)置新屬性值時拷貝一份。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末通孽,一起剝皮案震驚了整個濱河市序宦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌背苦,老刑警劉巖互捌,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異行剂,居然都是意外死亡秕噪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門厚宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腌巾,“玉大人,你說我怎么就攤上這事铲觉〕候” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵撵幽,是天一觀的道長灯荧。 經(jīng)常有香客問我,道長盐杂,這世上最難降的妖魔是什么逗载? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮链烈,結(jié)果婚禮上厉斟,老公的妹妹穿的比我還像新娘。我一直安慰自己强衡,他們只是感情好擦秽,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漩勤,像睡著了一般号涯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锯七,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音誉己,去河邊找鬼眉尸。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的噪猾。 我是一名探鬼主播霉祸,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袱蜡!你這毒婦竟也來了丝蹭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坪蚁,失蹤者是張志新(化名)和其女友劉穎奔穿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏晤,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡贱田,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘴脾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片男摧。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖译打,靈堂內(nèi)的尸體忽然破棺而出耗拓,到底是詐尸還是另有隱情,我是刑警寧澤奏司,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布乔询,位于F島的核電站,受9級特大地震影響结澄,放射性物質(zhì)發(fā)生泄漏哥谷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一麻献、第九天 我趴在偏房一處隱蔽的房頂上張望们妥。 院中可真熱鬧,春花似錦勉吻、人聲如沸监婶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惑惶。三九已至,卻和暖如春短纵,著一層夾襖步出監(jiān)牢的瞬間带污,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工香到, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鱼冀,地道東北人报破。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像千绪,于是被迫代替她去往敵國和親充易。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • Copyright ? 2017年ZaneWangWang. All rights reserved. 如果你看到...
    2897275c8a00閱讀 917評論 0 1
  • 一, iOS的內(nèi)存管理規(guī)則 1 基本原則 移動設(shè)備的內(nèi)存極其有限荸型,每個app所能占用的內(nèi)存是有限制的 當(dāng)app所占...
    okerivy閱讀 222評論 0 1
  • 一盹靴、MRC(手動引用計數(shù)): 不像 java 有垃圾回收機制,Objective-C 繼承于 C 瑞妇,使用一套基于對...
    Lee堅武閱讀 982評論 0 51
  • 總結(jié)自 美團(tuán)點評技術(shù)沙龍 Online 第4期 內(nèi)存管理的幾種方式 顯式內(nèi)存釋放(C:-free稿静、C++:-del...
    Mokyz閱讀 1,064評論 0 1
  • 神父最終還是選擇了那1300多萬鎊家產(chǎn),雖然他愛梅吉踪宠,他更愛他的名聲他的地位自赔,拿著這筆家產(chǎn)他可以飛黃騰達(dá),哈兒律師...
    hanxuerping閱讀 317評論 0 0