貓貓整理問題之:記憶體堆棧,整理記憶體堆棧

來源:互聯網
上載者:User

貓貓整理問題之:記憶體堆棧,整理記憶體堆棧

貓貓分享
原文地址:http://blog.csdn.net/u013357243?viewmode=contents

記憶體資料在記憶體中的存放

在電腦中,啟動並執行應用程式的資料都是儲存在記憶體中的。
不同類型的資料,儲存的記憶體地區不同,其中包括:

1:棧區(stack)由編譯器自動分配並釋放,一半存放函數的參數值,局部變數等。

2:堆區(heap)由程式員分配和釋放,如果程式員不釋放,程式結束時,可能會由作業系統回收。

3:全域區(靜態區)全域變數和靜態變數的儲存是放在一起的,初始化的全域變數和靜態變數存放在一塊地區,未初始化的全域變數和靜態變數在相鄰的另一塊地區,程式結束後由系統釋放。

上面三個很重要,下面三個瞭解4:文字常量區:存放常亮字串,程式結束後由系統釋放。5:程式碼區:存放函數的二進位代碼。6:寄存器去:用來儲存棧頂指標和指令指標(我們基本用不到。。。)。
棧記憶體區中得資料

棧區記憶體是壓棧的講究

特點:先進後出。     系統給自動回收。     由系統自動分配,速度較快。但程式員是無法控制的。
int sum(int x, int y){    NSLog(@"x: %p, Y: %p", &x, &y);    int result = x + y;    NSLog(@"%p", &result);    return result;}void demo1(){    // 在棧區中的變數,i本質上對應"記憶體位址"的"標籤"    // 指標 * 表示指向內容空間的內容 & 表示地址    int i = 10;    i = i + 5;    NSLog(@"==== %d", *(&i));    int j = 20;    NSLog(@"i:%p, J:%p", &i, &j);    int result = sum(i, j);    NSLog(@"%d %p", result, &result);}

記憶體

堆記憶體區中得資料

1:由於棧記憶體中的空間有限,(iOS=1M,MAC=8M)iOS的應用程式中,對象都是建立在堆中的。
2:堆區包括系統記憶體和虛擬記憶體(磁碟開闢緩衝),由所有正在啟動並執行應用程式共用使用。
3:堆區中的記憶體配置由作業系統負責,作業系統
使用一個“鏈表”統一維護所有已經分配的記憶體記錄。
4:由於堆區是由所有應用程式共用的,作業系統
以匿名【只記錄記憶體位址和大小,不記錄具體類型】的方式記錄已經分配的記憶體地區。
5:要訪問堆區中得資料,必須通過指標的方式才可以進行,指標的類型決定了訪問對中資料的方式。
6:當某一記憶體地區不再使用時,程式需要通知作業系統回收該記憶體地區,從而可以保證該記憶體地區被其他程式再次使用,否則,該地區將永遠無法被再次分配,這就是傳說中的“記憶體泄露”。
7:如果某一地區已經被釋放,仍然試圖訪問該地區,會提示“壞記憶體訪問”,這就是傳說中的“野指標訪問”。
8:相比較棧區,堆區中得效率要低很多,同時容易出現記憶體片段。
9:相比較棧區,堆區中得訪問方式更加靈活,對象佔用的記憶體也可以更大。

int main(int argc, const char * argv[]){    @autoreleasepool {        // 在堆中所有的變數類型都是匿名訪問的        // 能否訪問對象的屬性,或者調用方法,"取決於指定變數的類型"        // 所有堆中的變數都是通過指標來訪問的        id p = [[Person alloc] init];        [p setName:@"zhangsan"];        NSLog(@"%@ %p", [p name], p);        // 1. 將p指向 NULL(地址) => 0        // 2. 釋放p        // ** 在OC/C++中,nil可以調用任何的方法,都不會報錯        // nil是指標指向NULL的Null 物件 0        p = nil;        NSString *str = p;        NSLog(@"%ld %p", str.length, p);    }    return 0;}

堆區中的記憶體配置由作業系統負責,作業系統
使用一個“鏈表”統一維護所有已經分配的記憶體記錄。
鏈表:

由上部分代碼引申出新的問題:
nil NULL Nil都什麼關係?

nil和 null和NSNull的區別

nil是一個對象,而NULL是一個值,我的理解為nil是將對象設定為空白,而null是將基本類型設定為空白的,個人感覺有點像屬性當中,基本類型分配為assign NSString類型一般分配copy,而對象一般用retain。而且我們對於nil調用方法,不會產生crash或者拋出異常。
看一段

nil -> Null-pointer to objective- c objectNIL -> Null-pointer to objective- c classnull-> null pointer to primitive type or absence of data.

看一下用法

NSURL *url = nil;Class  class = Nil;int *pointerInt = NULL;

nil是一個對象指標為空白,Nil是一個類指標為空白,NULL是基礎資料型別 (Elementary Data Type)為空白。這些可以理解為nil,Nil, NULL的區別吧。

ps:建立iOS交流學習群:304570962
可以加貓貓QQ:1764541256 或則znycat
讓我們一起努力學習吧。
原文:http://blog.csdn.net/u013357243?viewmode=contents

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.