前言:木木最近忙于面試,分類總結(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)存問題
@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ù)增高
自動釋放池是什么,如何工作的?
- 定義:是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ù)制粘貼喲~