iOS基礎(chǔ)面試題之內(nèi)存管理篇

前言:木木最近忙于面試,分類總結(jié)了一些基礎(chǔ)面試題,接下來會分篇章給大家分享出來~

autoreleasePool一般你在什么地方使用到?

  • 大循環(huán)
    • 在大循環(huán)中如果不調(diào)用autorelease,會造成內(nèi)存泄漏
  • 多線程
    • 用于釋放子線程

內(nèi)存管理的概念

  • 定義:高效快速的管理內(nèi)存,在適當(dāng)?shù)臅r候回收和釋放內(nèi)存資源
  • MRC中, 使用"引用計(jì)數(shù)機(jī)制", 需要手動管理內(nèi)存
  • ARC中, 使用"強(qiáng)弱引用機(jī)制", 系統(tǒng)自動在合適的地方加上retain,release.
  • 常見的引起內(nèi)存泄漏的原因:
    • 循環(huán)引用
    • 大循環(huán)

Objective-C堆和棧的區(qū)別?

  • 管理方式不同:
    • 棧是由系統(tǒng)自動管理,無需手動釋放。堆是由程序員手動管理,會出現(xiàn)內(nèi)存泄漏問題
  • 申請大小不同:
    • 棧的內(nèi)存是系統(tǒng)固定好的常數(shù),是一塊連續(xù)的內(nèi)存區(qū)域,一旦申請空間超過棧空間,會造成棧溢出
    • 堆是不連續(xù)的內(nèi)存區(qū)域,靈活性大
  • 碎片問題:
    • 堆中:頻繁的alloc/new會造成內(nèi)存空間的不連續(xù),大量的內(nèi)存碎片,降低程序效率
    • 棧中,先進(jìn)后出原則,不存在碎片問題
  • 分配方式
    • 堆是動態(tài)分配的,沒有靜態(tài)
    • 棧有靜態(tài)和動態(tài)兩種分配方式,靜態(tài)分配如局部變量的分配,是由編譯器完成的,動態(tài)分配和堆的不同,是由編譯器來釋放,無需手動實(shí)現(xiàn)
  • 分配效率
    • 棧是計(jì)算機(jī)的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會給棧提供技術(shù)支持,這就決定了棧的分配效率比堆高,堆的底層是C/C++函數(shù)庫提供的,其結(jié)構(gòu)很復(fù)雜

內(nèi)存管理的幾個原則是什么?

  • 誰創(chuàng)建,誰釋放,誰引用,誰管理
  • 在MRC中,一次retain必須對應(yīng)一次release消息
  • 在ARC中強(qiáng)弱引用(注意strong / weak關(guān)鍵字)
    • 當(dāng)strong修飾的指針指向新值或者不復(fù)存在時,其相關(guān)聯(lián)的對象會自動釋放
    • 當(dāng)weak修飾的對象,其擁有者指向新值或者不復(fù)存在時,weak修飾的對象會自動置為nil

[NSAarry arrayWithObject:<id>] 和 NSMuatableArray *array = [NSMuatableArray array] 這兩個方法創(chuàng)建數(shù)組后,需要對數(shù)組做釋放操作嗎?

  • 不需要,編譯器會自動將其添加到自動釋放池中

找內(nèi)存問題

詳細(xì)博客第14題

@autoreleasepool {
for (long i = 0; i < largeNumber; i++) {
Person *per = [[Person alloc] init];
[per autorelease];
}}

以上代碼有什么內(nèi)存問題,如何改正?

  • 會導(dǎo)致內(nèi)存泄漏
  • 使用autorelease會將對象存放到最近的釋放池中,不會使引用計(jì)數(shù)立即-1, 在大循環(huán)執(zhí)行的過程中內(nèi)存會持續(xù)增高

自動釋放池是什么,如何工作的?

詳細(xì)博客第30題

  • 定義:是OC的一種內(nèi)存自動回收機(jī)制,可以將一些臨時對象通過自動釋放池回收并統(tǒng)一釋放
  • 工作原理:當(dāng)自動釋放池被銷毀時,池內(nèi)所有Object都會被release1次, 相當(dāng)于延遲調(diào)用release

常見的出現(xiàn)內(nèi)存循環(huán)引用的場景有哪些?

  • 兩個對象相互持有, 導(dǎo)致互相無法釋放內(nèi)存
    • block中訪問外界變量
    • delegate沒有使用weak修飾

內(nèi)存管理機(jī)制

  • 引用計(jì)數(shù)機(jī)制
  • 強(qiáng)弱引用機(jī)制
  • 自動釋放池
  • 屬性參數(shù)(屬性參數(shù)里面隱藏了內(nèi)存管理的細(xì)節(jié))

內(nèi)存警告的傳遞過程

  • 手機(jī)內(nèi)存不足產(chǎn)生事件-->通知應(yīng)用程序-->調(diào)用應(yīng)用程序代理方法 -->把事件傳遞給窗口(UIWindow)-->窗口傳給控制器-->調(diào)用控制器的內(nèi)存警告方法

僅供木木學(xué)習(xí),以及有需要的伙伴們閱讀~可轉(zhuǎn)載,不可復(fù)制粘貼喲~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容