最近要開始準備找實習單位了,作作筆試題,看看各位大神的面試經歷,發現本身要學習的東西真的還有不少,雖然也作過幾個的項目,可是真正拿過筆試題一看,才發現本身對基礎這方面的東西,確實有點忽視了,因此最近開啓惡補模式。ios
這幾天在研究ios內存分析這一塊,才發現本身原來忽視了這麼多重要的東西,在這裏和你們分享一下。面試
先來看一段代碼:學習
NSString* s;
s = [[NSString alloc] initWithString:@"hello ios"];
這是一段最簡單的字符串定義,可是看似簡單,其實有不少東西可能會被忽略掉spa
1.這裏的s實際上是個指針,在oc中除了基本數據類型以外的變量類型都是指針類型,oc的對象也是經過指針進行操做的。指針
2. 在第一段代碼定義了NSString類型的指針變量,可是並無指向任何對象,第二段代碼alloc一個NSString對象 而後使s指向它,並經過s開始其的後續操做。code
3. 這裏s的內存空間在棧內存中,「hello ios」在堆內存中。對象
下面經過圖示說明一下blog
再來看一個例子內存
@interface C: NSObject { int a; int b; } @end int main(int argc, const char *argv[]) { C *c1 = [[C alloc]init]; C *c2 = [[C alloc]init]; }
內存分佈狀況字符串
看到這裏你們也就能明白了,oc中建立的對象指針存儲在棧內存中,而alloc出來的對象的內存在堆內存中,棧內存中的指針經過賦值指向堆內存中的對象,而後經過棧內存中的指針訪問對象及其變量,也就是說,其實咱們在建立一個對象時實際上是利用了兩個部分的內存空間。