最近要開始準備找實習單位了,做做筆試題,看看各位大神的面試經歷,發現自己要學習的東西真的還有很多,雖然也做過幾個的項目,但是真正拿過筆試題一看,才發現自己對基礎這方面的東西,確實有點忽視了,所以最近開啟惡補模式。
這幾天在研究ios內存分析這一塊,才發現自己原來忽視了這么多重要的東西,在這里和大家分享一下。
先來看一段代碼:
NSString* s;
s = [[NSString alloc] initWithString:@"hello ios"];
這是一段最簡單的字符串定義,但是看似簡單,其實有很多東西可能會被忽略掉
1.這里的s其實是個指針,在oc中除了基本數據類型之外的變量類型都是指針類型,oc的對象也是通過指針進行操作的。
2. 在第一段代碼定義了NSString類型的指針變量,但是并沒有指向任何對象,第二段代碼alloc一個NSString對象 然后使s指向它,并通過s開始其的后續操作。
3. 這里s的內存空間在棧內存中,“hello ios”在堆內存中。
下面通過圖示說明一下
再來看一個例子
@interface C: NSObject{ int a; int b; }@endint main(int argc, const char *argv[]){ C *c1 = [[C alloc]init]; C *c2 = [[C alloc]init]; }
內存分布情況
看到這里大家也就能明白了,oc中創建的對象指針存儲在棧內存中,而alloc出來的對象的內存在堆內存中,棧內存中的指針通過賦值指向堆內存中的對象,然后通過棧內存中的指針訪問對象及其變量,也就是說,其實我們在創建一個對象時其實是利用了兩個部分的內存空間。
新聞熱點
疑難解答