#####面試:說一說對內存管理的理解?(原理)程序員
- 手動內存管理(MRC):1.在建立一個對象的時候系統會自動建立這個對象的引用計數並賦值爲1;2.當引用計數爲0的時候,對象會去調用dealloc方法來銷燬對象;3.對象調用release方法會讓引用計數減1,retain方法會讓引用計數加1;面試
- 自動內存管理(ARC):1.在ARC管理內存的實質仍是經過引用計數去管理的,可是程序員再也不關心引用計數器的值,由於在ARC環境下,系統會在程序編譯的時候會自動在合適的地方添加retain和release或者autorelease方法;在ARC中,當有強指針指向對象的時候對象不銷燬,弱指針不影響對象的銷燬,指針默認都是強指針,_weak:使用這個關鍵字修飾的指針都是弱指針;默認是_strong.數組
#####面試題:內存管理的原則?函數
- 手動內存管理的原則:程序中若是出現alloc,retain,new必須配對出現release或者autorelease:誰建立誰釋放,在哪兒建立在哪兒釋放;誰加1誰減1;指針
#####爲何須要內存管理?對象
- 內存管理的兩大問題:內存泄露(沒有釋放)和野指針(沒有使用或者置空)內存
#####說說autoreleasePool和autorelease的做用:字符串
- autoreleasepool的原理:當autoreleasePool銷燬的時候會自動將自動釋放池中全部的對象調用一次release方法;it
- autorelease的做用:將對象添加到自動釋放池中(並非寫在自動釋放池的大括號中得對象就是自動釋放池的對象);內存管理
#####MRC中符合內存管理的set方法的書寫:
- 舊值release,新值retain,而後賦值
#####屬性修飾符
- strong:控制@property實現符合內存管理的set方法,引用計數加1應用於修飾通常的對象;
- weak:控制@property實現通常的set方法(直接賦值),修飾對象用來避免循環引用;
- copy:控制@property實現的set方法,會先建立一個新的對象,將參數的值傳給新的對象,最後將新的對象賦給成員變量(經常使用來修飾字符串,數組,字典和block);
- assign:控制@property實現通常的set方法(直接賦值),經常使用來修飾基本數據類型
- retain:至關於MRC的strong(實現的set方法就是舊值release,新值retain);
```Object-c
1.內存管理的做用:解決內存泄露和野指針的問題
2.爲何要內存管理,須要注意的問題是什麼?
3.內存管理的原理:MRC(引用計數管理內存)和ARC(強指針和弱指針)。
4.什麼是內存管理原則:誰建立誰釋放,誰+1誰-1
5.在內存管理中setter函數的寫法(舊值release,新值retain,賦值)
6.@property參數retain避免循環引用(至關於strong)
7.何時使用autorelease?與release的區別:autorelease將對象添加到自動釋放池中,
release就是即時將對象的引用計數器減1,對象須要延時銷燬的時候使用autorelease方法;
8.什麼是自動釋放池?注意:autoreleasePool和autorelease是成對出現的!!
9.闡述內存管理:
10.一個工程中可使用NSAutoreleasePool或者@autoreleasepool建立多個自動釋放池;
11.手動內存管理必須即時銷燬對象,而autorelease會延遲對象的銷燬,若是全部對象都延遲 時銷燬的話至關於沒有作內存管理;
12.在ARC中能夠重寫dealloc方法可是絕對不能夠調用父類的dealloc方法,在對象將要被銷燬的時候會自動調用dealloc.
```
```Object-c
#import <Foundation/Foundation.h>
#import "FJStudent.h"//避免重複引用
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.建立一個學生對象(對象在堆上)
//2.建立一個學生指針(指針在棧上)
//3.指針指向了學生對象(指針中存儲了學生對象的地址)
FJStudent *student = [[FJStudent alloc]init];
//若是這裏加上student = nil那麼在這裏就被銷燬,由於指針已經置空
//若是:_weak FJStudent *student = [[FJStudent alloc]init];
//弱指針建立就被銷燬!
student.name = @"luhan ";
}//在這裏被釋放,跟autoreleasepool無關,由於在堆上建立一個學生對象
//在棧上建立一個強指針,遇到花括號後,指針被銷燬,沒有強指針指向對象,因此被銷燬;
return 0;
}
```