Objective-C記憶體管理相關的面試題,objective-c記憶體管理
iOS應用程式出現Crash(閃退),90%以上的原因是記憶體問題。在一個擁有數十個甚至是上百個類的工程裡,尋找記憶體問題極其困難。瞭解記憶體常見問題,能幫我們減少出錯幾率。記憶體問題體現在三個方面:記憶體溢出、野指標異常,記憶體過渡釋放。
在面試過程中,面試官也經常會問到關於記憶體方面的問題,在這裡,我和大家分享兩個簡單地面試題。
面試題一:
@autoreleasepool { for (long i = 0; i < largeNumber; i++) { Person *per = [[Person alloc] init]; [per autorelease]; } }其中largeNumber是一個很大的數,這道題有記憶體問題嗎?如果有請在不修改已經寫好代碼的情況下解決記憶體問題。我們都知道,記憶體管理的原則:如果對一個對象使用了alloc、copy、retain,那麼你必須使用相應的release或者autorelease。咋一看,這道題目有alloc,也有autorelease,兩者對應起來了,沒問題。但是我們來仔細推敲一下,autorelease雖然會使引用計數減一,但是它並不是立即減一,它的本質功能只是把對象放在離他最近的自動釋放池中,當自動釋放池銷毀了,才會向自動釋放池中的每一個對象發送release訊息。那麼,這道題的問題就在autorelease這裡。因為largeNUmber是一個很大的數,autorelease又不能使引用計數立即減一,所以在迴圈結束前會造成記憶體溢出的問題。解決方案如下:
@autoreleasepool { for (long i = 0; i < largeNumber; i++) { @autoreleasepool { Person *per = [[Person alloc] init]; [per autorelease]; } } }
在迴圈內部再加一個自動釋放池,這樣就能保證每建立一個對象就能及時釋放。
面試題二:
@autoreleasepool { NSString *per = [[NSString alloc] init]; [per retain]; [per retain]; per = @"aa"; [per release]; [per release]; [per release]; }這道題同樣有記憶體問題,存在如下問題,1.記憶體溢出問題。2.指向常量區的對象不用release。我們來分析一下這道題,表面看起來,alloc,retain和release對應起來了,貌似沒什麼問題。但是我們分析一下per = @"aa"; 這條語句。指標變數per原本指向一塊開闢的堆區空間,但是經過重新給per賦值,那麼per的指向就發生了改變,由原來指向堆區空間,到指向常量區。指向常量區以後,再對per發送release訊息,它就是對常量區釋放,而常量區根本就不用釋放,這樣就導致原來開闢的堆區空間沒有釋放,會造成記憶體溢出的問題。
幫忙解釋一下Objective-C的記憶體管理部分
1.當你用alloc或者retain給對象分配了記憶體後要用release
2.不用的話,會很容易導致程式記憶體崩潰(如果是iPhone手機開發的話)
3.自動釋放池是你不用管的,一般在main函數裡面自動分配後自動回收
ps:樓主應該結合C語言理解,這個分配記憶體和回收記憶體思想來自C語言
對於objective-c的記憶體管理問題
我去。。得先release 再nil
[string release];
string = nil;
[task release];
task = nil;