01記憶體管理-概述

葉喬木發表於2018-12-04

記憶體管理

  • 記憶體消耗
  • 記憶體管理模型
  • 語言架構
  • 減少記憶體使用的實踐

1 記憶體消耗

  • 棧大小

每一個執行緒都有專有的棧空間,棧記憶體線上程存在期間自由使用。

每一個函式都有其自己的棧幀,所有的變數都會載入到方法的棧幀中,並且消耗一定的記憶體。

(函式的遞迴呼叫自己說白了就是棧記憶體的溢位)

  • 堆大小

每個程式的所有執行緒共享一個堆,一個裝置的可以使用的堆大小遠遠小於記憶體的RAM,最多不超過2分之一。

通過類建立的物件都存放在堆當中

建立一個Person 類

@interface Person : NSObject


/** */
@property (nonatomic,strong)NSString *name;

/** */
@property (nonatomic,assign)NSInteger age;


@end

在另外一個類上面

// 這裡面建立的Person 就是
- (Person *)createPersonWithName:(NSString *)name age:(NSInteger)age
{
    // 通過類建立的s所有的資料都存放在堆中
    Person  *p = [Person new];
    p.age = age;
    p.name = name;
    return p;
    
}

// 函式中將堆記憶體中copy到棧中
- (void)totalAge{
    
    NSMutableArray * pArr = [NSMutableArray array];
    // 0 for  迴圈 建立 10個人
    for (int i = 0; i < 10; i ++) {
        NSString *name = [NSString stringWithFormat:@"人物--%d",i];
        [pArr addObject:[self createPersonWithName:name age:(NSInteger)i]];
    }
    
    // 1 計算著10個人的年紀之和
    // totalAge 是開闢棧記憶體的
    NSInteger totalAge = 0;
    for (Person *p in pArr) {
        
        // MARK 在使用跑p的 age的時候,必須要先複製到棧上面,才能進行加到totalAge 上
        totalAge += p.age;
    }

}

相關文章