很多面試的情況下ITO都喜歡問你一些內(nèi)存管理方面的問題忍些,通常會(huì)這樣開始:
你了解iOS的內(nèi)存管理么?說一下你對(duì)iOS內(nèi)存管理的理解?然后你會(huì)說一下什么黃金法則两曼,自動(dòng)引用計(jì)數(shù)什么的。然后又會(huì)問你一句還有么玻驻,然后呢悼凑?是不是瞬間懵逼了,你會(huì)想就這么多呀璧瞬,還有什么呀户辫?
我覺得類似這樣的問題應(yīng)該分類進(jìn)行回答,就iOS內(nèi)存管理來說我是這么回答的:iOS內(nèi)存管理分MRC和ARC兩種情況下嗤锉,
MRC
在iOS5之前是MRC它的內(nèi)存是需要開發(fā)者自己去管理的也就是我們說的手動(dòng)管理內(nèi)存渔欢,(這時(shí)你可以說iOS內(nèi)存管理的黃金法則了):
凡是使用alloc、init瘟忱、copy膘茎、nsmutablecopy、retain進(jìn)行創(chuàng)建對(duì)象的都要使用release或者autorelease進(jìn)行釋放酷誓;(附加release和autorelease的區(qū)別披坏?)
規(guī)則:
1、Objective-C類中實(shí)現(xiàn)了引用計(jì)數(shù)器盐数,對(duì)象知道自己當(dāng)前被引用的次數(shù)
2棒拂、最初對(duì)象的計(jì)數(shù)器為1?
3、如果需要引用對(duì)象玫氢,可以給對(duì)象發(fā)送一個(gè)retain消息帚屉,這樣對(duì)象的計(jì)數(shù)器就加1
4、當(dāng)不需要引用對(duì)象了漾峡,可以給對(duì)象發(fā)送release消息攻旦,這樣對(duì)象計(jì)數(shù)器就減1
5、當(dāng)計(jì)數(shù)器減到0生逸,自動(dòng)調(diào)用對(duì)象的dealloc函數(shù)牢屋,對(duì)象就會(huì)釋放內(nèi)存
6、計(jì)數(shù)器為0的對(duì)象不能再使用release和其他方法
ARC
在ARC內(nèi)存管理模式下槽袄,其屬性的標(biāo)識(shí)符有assign烙无,strong,weak遍尺,copy截酷;
@property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默認(rèn)為unsafe_unretained
(1)assign在arc中修飾的是基本數(shù)據(jù)類型,mrc中修飾的是delegate防止強(qiáng)強(qiáng)循環(huán)引用造成內(nèi)存泄漏乾戏。(自己查找一下什么是強(qiáng)強(qiáng)循環(huán)引用迂苛,如果不明白的話)
(2)strong相當(dāng)于mrc中的retain三热,使得對(duì)象被引用時(shí)引用計(jì)數(shù)加1.
(3)weak的作用相當(dāng)于assign,弱引用使用的對(duì)象三幻。在arc中delegate的修飾詞是weak就漾。作用防止循環(huán)引用造成內(nèi)存泄漏。但是assign和weak是有區(qū)別的:
首先assign修飾的是基本數(shù)據(jù)類型赌髓,簡(jiǎn)單賦值不改變引用計(jì)數(shù)从藤,weak只可以修飾oc中的對(duì)象。其次arc環(huán)境下weak修飾的對(duì)象被釋放后指向?qū)ο蟮闹羔槙?huì)被自動(dòng)置為nil锁蠕,而assign修飾的變量可能不會(huì)被置為nil夷野,造成野指針會(huì)導(dǎo)致程序crash。
(4)copy修飾的類型一般是NSString荣倾,NSArray悯搔,NSDictionary。建立一個(gè)索引計(jì)數(shù)為1的對(duì)象舌仍,然后釋放舊對(duì)象妒貌。
基本上你能想起來的也就是這么多了,然后面試官就會(huì)問還有么铸豁?其實(shí)我也懵逼了一下灌曙,接下來我就會(huì)從內(nèi)存管理的好處說:iOS內(nèi)存管理機(jī)制的好處就是為了讓開發(fā)人員方便的管理內(nèi)存,減少程序中的內(nèi)存泄漏节芥,在內(nèi)存管理難度與性能之間找一個(gè)最佳的平衡點(diǎn)在刺。(其實(shí)就一句話,說完我就附上一句話头镊,對(duì)于內(nèi)存管理我暫時(shí)就了解這么多)