iOS經(jīng)典面試題總結(jié)--內(nèi)存管理

本人ios初學(xué)者,為自己學(xué)習(xí)方便婿屹,復(fù)制各位大神的學(xué)習(xí)性文章放在自己簡(jiǎn)書(shū)里灭美,僅作為自己學(xué)習(xí)方便使用,如果作者疑此行為侵權(quán)昂利,請(qǐng)隨時(shí)聯(lián)系本人刪除届腐,如有共同學(xué)習(xí)者復(fù)制此文章,請(qǐng)注明原出處

本文為投稿文章蜂奸,作者:jingxianli0922

我根據(jù)自己的情況做了一下總結(jié)犁苏,答案是我總結(jié)的,如有答的不好的地方扩所,希望批評(píng)指正以及交流围详,謝謝!

內(nèi)存管理

1.什么是ARC祖屏?

ARC是automatic reference counting自動(dòng)引用計(jì)數(shù)助赞,在程序編譯時(shí)自動(dòng)加入retain/release。在對(duì)象被創(chuàng)建時(shí)retain count+1袁勺,在對(duì)象被release時(shí)count-1雹食,當(dāng)count=0時(shí),銷毀對(duì)象期丰。程序中加入autoreleasepool對(duì)象會(huì)由系統(tǒng)自動(dòng)加上autorelease方法群叶,如果該對(duì)象引用計(jì)數(shù)為0漠嵌,則銷毀。那么ARC是為了解決MRC手動(dòng)管理內(nèi)存存在的一些而誕生的盖呼。

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

釋放一個(gè)堆內(nèi)存時(shí),首先要確定指向這個(gè)堆空間的指針都被release了化撕。(避免提前釋放)

釋放指針指向的堆空間几晤,首先要確定哪些指向同一個(gè)堆,這些指針只能釋放一次植阴。(避免釋放多次蟹瘾,造成內(nèi)存泄露)

模塊化操作時(shí),對(duì)象可能被多個(gè)模塊創(chuàng)建和使用掠手,不能確定最后由誰(shuí)釋放

多線程操作時(shí)憾朴,不確定哪個(gè)線程最后使用完畢。

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

循環(huán)參照:A有個(gè)屬性參照B,B有個(gè)屬性參照A做祝,如果都是strong參照的話砾省,兩個(gè)對(duì)象都無(wú)法釋放。

死循環(huán):如果有個(gè)ViewController中有無(wú)限循環(huán)混槐,也會(huì)導(dǎo)致即使ViewController對(duì)應(yīng)的view消失了编兄,ViewController也不能釋放。

2.block一般用那個(gè)關(guān)鍵字修飾声登,為什么狠鸳?

block一般使用copy關(guān)鍵之進(jìn)行修飾,block使用copy是從MRC遺留下來(lái)的“傳統(tǒng)”悯嗓,在MRC中件舵,方法內(nèi)容的block是在棧區(qū)的,使用copy可以把它放到堆區(qū)绅作。但在ARC中寫不寫都行:編譯器自動(dòng)對(duì)block進(jìn)行了copy操作芦圾。

3.用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字俄认,為什么个少?如果改用strong關(guān)鍵字,可能造成什么問(wèn)題眯杏?

答:用@property聲明 NSString夜焦、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字岂贩,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString茫经、NSMutableArray、NSMutableDictionary,他們之間可能進(jìn)行賦值操作卸伞,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)抹镊,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

如果我們使用是strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性荤傲。

copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似垮耳。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)遂黍。 當(dāng)屬性類型為NSString時(shí)终佛,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例雾家。這個(gè)類是NSString的子類铃彰,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串芯咧,那么設(shè)置完屬性之后牙捉,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以敬飒,這時(shí)就要拷貝一份“不可變” (immutable)的字符串鹃共,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable)驶拱,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份霜浴。

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

每個(gè)線程(包含主線程)都有一個(gè)Runloop阴孟。對(duì)于每一個(gè)Runloop,系統(tǒng)會(huì)隱式創(chuàng)建一個(gè)Autorelease pool税迷,這樣所有的release pool會(huì)構(gòu)成一個(gè)像callstack一樣的一個(gè)棧式結(jié)構(gòu)永丝,在每一個(gè)Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)腁utorelease pool會(huì)被銷毀箭养,這樣這個(gè)pool里的每個(gè)Object會(huì)被release慕嚷。

5.@property 的本質(zhì)是什么?ivar毕泌、getter喝检、setter 是如何生成并添加到這個(gè)類中的。

“屬性”(property)有兩大概念:ivar(實(shí)例變量)撼泛、存取方法(access method=getter)挠说,即@property = ivar + getter + setter。

例如下面的這個(gè)類:

@interface WBTextView :UITextView

@property (nonatomic,copy)NSString *placehold;

@property (nonatomic,copy)UIColor *placeholdColor;

@end

類完成屬性的定以后愿题,編譯器會(huì)自動(dòng)編寫訪問(wèn)這些屬性的方法(自動(dòng)合成autosynthesis)损俭,上述代碼寫出來(lái)的類等效與下面的代碼:

@interface WBTextView :UITextView

- (NSString *)placehold;

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

-(UIColor *)placeholdColor;

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

@end

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

6.分別寫一個(gè)setter方法用于完成

@property (nonatomic,retain)NSString *name和

@property (nonatomic,copy) NSString *name

retain屬性的setter方法是保留新值并釋放舊值蛙奖,然后更新實(shí)例變量,令其指向新值杆兵。順序很重要雁仲。假如還未保留新值就先把舊值釋放了,而且兩個(gè)值又指向同一個(gè)對(duì)象琐脏,先執(zhí)行的release操作就可能導(dǎo)致系統(tǒng)將此對(duì)象永久回收伯顶。

-(void)setName:(NSString *)name

{

[name retain];

[_name release];

_name = name;

}

-(void)setName:(NSString *)name

{

[_name release];

_name = [name copy];

}

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

assign適用于基本數(shù)據(jù)類型骆膝,weak是適用于NSObject對(duì)象,并且是一個(gè)弱引用灶体。

assign其實(shí)頁(yè)可以用來(lái)修飾對(duì)象阅签,那么為什么不用它呢?因?yàn)楸籥ssign修飾的對(duì)象在釋放之后蝎抽,指針的地址還是存在的政钟,也就是說(shuō)指針并沒(méi)有被置為nil。如果在后續(xù)內(nèi)存分配中樟结,剛才分到了這塊地址养交,程序就會(huì)崩潰掉。而weak修飾的對(duì)象在釋放之后瓢宦,指針地址會(huì)被置為nil碎连。

_block是用來(lái)修飾一個(gè)變量,這個(gè)變量就可以在block中被修改驮履。

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

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

8.請(qǐng)說(shuō)出下面代碼是否有問(wèn)題,如果有問(wèn)題請(qǐng)修改玫镐?

@autoreleasepool {

for (int i=0; i[largeNumber; i++) { (因識(shí)別問(wèn)題倒戏,該行代碼中尖括號(hào)改為方括號(hào)代替)

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

[per autorelease];

} ?}

內(nèi)存管理的原則:如果對(duì)一個(gè)對(duì)象使用了alloc、copy恐似、retain杜跷,那么你必須使用相應(yīng)的release或者autorelease。咋一看矫夷,這道題目有alloc葛闷,也有autorelease,兩者對(duì)應(yīng)起來(lái)双藕,應(yīng)該沒(méi)問(wèn)題孵运。但autorelease雖然會(huì)使引用計(jì)數(shù)減一,但是它并不是立即減一蔓彩,它的本質(zhì)功能只是把對(duì)象放到離他最近的自動(dòng)釋放池里治笨。當(dāng)自動(dòng)釋放池銷毀了驳概,才會(huì)向自動(dòng)釋放池中的每一個(gè)對(duì)象發(fā)送release消息。這道題的問(wèn)題就在autorelease旷赖。因?yàn)閘argeNumber是一個(gè)很大的數(shù)顺又,autorelease又不能使引用計(jì)數(shù)立即減一,所以在循環(huán)結(jié)束前會(huì)造成內(nèi)存溢出的問(wèn)題等孵。

解決方案如下:

@autoreleasepool {

for (int i=0; i[100000; i++) { (因識(shí)別問(wèn)題稚照,該行代碼中尖括號(hào)改為方括號(hào)代替)

@autoreleasepool {

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

[per autorelease];

}}}

在循環(huán)內(nèi)部再加一個(gè)自動(dòng)釋放池,這樣就能保證每創(chuàng)建一個(gè)對(duì)象就能及時(shí)釋放俯萌。

9.請(qǐng)問(wèn)下面代碼是否有問(wèn)題果录,如有問(wèn)題請(qǐng)修改?

@autoreleasepool {

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

[str retain];

[str retain];

str = @"jxl";

[str release];

[str release];

[str release];

}

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

指針變量str原本指向一塊開(kāi)辟的堆區(qū)空間,但是經(jīng)過(guò)重新給str賦值棋恼,str的指向發(fā)生了變化返弹,由原來(lái)指向堆區(qū)空間,到指向常量區(qū)爪飘。常量區(qū)的變量根本不需要釋放义起,這就導(dǎo)致了原來(lái)開(kāi)辟的堆區(qū)空間沒(méi)有釋放,照成內(nèi)存泄露师崎。

10.什么情況下使用weak關(guān)鍵字默终,相比assign有什么不同?什么情況使用weak關(guān)鍵字犁罩?

在ARC中穷蛹,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用weak來(lái)解決昼汗。比如delegate代理

自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用肴熏,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用weak顷窒,自定義控件屬性一般也使用weak蛙吏。

不同點(diǎn):

weak此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時(shí)鞋吉,設(shè)置方法既不保留新值鸦做,也不釋放舊值。此特性與assign一樣谓着,然而在屬性所指的對(duì)象遭到推毀時(shí)泼诱,屬性值也會(huì)清空。而assign的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類型” (scalar type赊锚,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作治筒。

assign可以用非OC對(duì)象屉栓,而weak必須用于OC對(duì)象。

11.內(nèi)存管理語(yǔ)義(assign耸袜、strong友多、weak等的區(qū)別)

assign “設(shè)置方法” 只會(huì)執(zhí)行針對(duì)“純量”的簡(jiǎn)單賦值操作。

strong? 此特質(zhì)表明該屬性定義了一種“擁有關(guān)系”堤框。為這種屬性設(shè)置新值時(shí)域滥,設(shè)置方法會(huì)先保留新值,并釋放舊值蜈抓,然后再將新值設(shè)置上去启绰。

weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時(shí)沟使,設(shè)置方法既不保留新值委可,也不釋放舊值。此特質(zhì)同assign類似格带,然而在屬性所指的對(duì)象遭到推毀時(shí),屬性值也會(huì)清空刹枉。

unsafe_unretained? 此特質(zhì)的語(yǔ)義和assign相同叽唱,但是它適用于“對(duì)象類型”,該特質(zhì)表達(dá)一種“非擁有關(guān)系”微宝,當(dāng)目標(biāo)對(duì)象遭到推毀時(shí)棺亭,屬性值不會(huì)自動(dòng)清空,這一點(diǎn)與weak有區(qū)別蟋软。

copy 此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似镶摘。然而設(shè)置方法并不保留新值,而是設(shè)置方法并不保留新值岳守,而是將其“拷貝”凄敢。當(dāng)屬性類型為NSString*時(shí),經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性湿痢,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例涝缝。這個(gè)類是NSString的子類,表示一種可以修改其值的字符串譬重,此時(shí)若是不拷貝字符串拒逮,那么設(shè)置完屬性之后,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改臀规。所以滩援,這時(shí)就要拷貝一份“不可變”的字符串,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)塔嬉。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的”玩徊,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份租悄。

后續(xù)會(huì)繼續(xù)增加內(nèi)存管理方面的內(nèi)容以及多線程等內(nèi)容,持續(xù)更新中....佣赖,敬請(qǐng)期待恰矩!

參考:

招聘一個(gè)靠譜的iOS

《招聘一個(gè)靠譜的iOS》面試題參考答案(上)

Matt Galloway 《Effective Objective-C 2.0》

微信號(hào):CocoaChinabbs

▲長(zhǎng)按二維碼“識(shí)別”關(guān)注即可免費(fèi)學(xué)習(xí) iOS 開(kāi)發(fā)

月薪十萬(wàn)、出任CEO憎蛤、贏娶白富美外傅、走上人生巔峰不是夢(mèng)

--------------------------------------

商務(wù)合作QQ:645047738

投稿郵箱:support@cocoachina.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俩檬,隨后出現(xiàn)的幾起案子萎胰,更是在濱河造成了極大的恐慌,老刑警劉巖棚辽,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技竟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屈藐,警方通過(guò)查閱死者的電腦和手機(jī)榔组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)联逻,“玉大人搓扯,你說(shuō)我怎么就攤上這事“椋” “怎么了锨推?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)公壤。 經(jīng)常有香客問(wèn)我换可,道長(zhǎng),這世上最難降的妖魔是什么厦幅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任沾鳄,我火速辦了婚禮,結(jié)果婚禮上确憨,老公的妹妹穿的比我還像新娘洞渔。我一直安慰自己,他們只是感情好缚态,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布磁椒。 她就那樣靜靜地躺著,像睡著了一般玫芦。 火紅的嫁衣襯著肌膚如雪浆熔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音医增,去河邊找鬼慎皱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叶骨,可吹牛的內(nèi)容都是我干的茫多。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忽刽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼天揖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跪帝,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤今膊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伞剑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斑唬,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年黎泣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恕刘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抒倚,死狀恐怖褐着,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衡便,我是刑警寧澤献起,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布洋访,位于F島的核電站镣陕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姻政。R本人自食惡果不足惜呆抑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汁展。 院中可真熱鬧鹊碍,春花似錦、人聲如沸食绿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)器紧。三九已至耀销,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铲汪,已是汗流浹背熊尉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工罐柳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狰住。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓张吉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親催植。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肮蛹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • 內(nèi)存管理 1.什么是ARC? ARC是automatic reference counting自動(dòng)引用計(jì)數(shù)查邢,在程序...
    遇Am閱讀 255評(píng)論 0 0
  • 內(nèi)存管理 1.什么是ARC蔗崎? ARC是automatic reference counting自動(dòng)引用計(jì)數(shù),在程序...
    小熱狗閱讀 261評(píng)論 0 1
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,131評(píng)論 30 470
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制扰藕。與retain配對(duì)使用的方法是dealloc還是release缓苛,為什么?需要與a...
    丶逐漸閱讀 1,953評(píng)論 1 16
  • 1.OC里用到集合類是什么邓深? 基本類型為:NSArray未桥,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,366評(píng)論 0 3