ios開發:OC對象的內存分析


   最近要開始准備找實習單位了,做做筆試題,看看各位大神的面試經歷,發現自己要學習的東西真的還有很多,雖然也做過幾個的項目,但是真正拿過筆試題一看,才發現自己對基礎這方面的東西,確實有點忽視了,所以最近開啟惡補模式。

   這幾天在研究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;       
}
@end


int main(int argc, const char *argv[])
{
  C *c1 = [[C alloc]init];
  C *c2 = [[C alloc]init];      
}

內存分布情況

  看到這里大家也就能明白了,oc中創建的對象指針存儲在棧內存中,而alloc出來的對象的內存在堆內存中,棧內存中的指針通過賦值指向堆內存中的對象,然后通過棧內存中的指針訪問對象及其變量,也就是說,其實我們在創建一個對象時其實是利用了兩個部分的內存空間。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM