iOS程序内存分布
iOS的程序內存分為五大區域,分別為棧,堆,BSS,全局變量,代碼區。
| 運行時分配 | 棧 | 局部變量,函數參數 |
| 運行時分配 | 堆 | 程序代碼new出的對象 |
| 編譯時分配 | BSS | 靜態變量,未初始化的全局變量 |
| 編譯時分配 | 數據段 | 已經初始化的全局變量,常量 |
| 編譯時分配 | 代碼段 | 程序二進制代碼 |
棧區的地址一般以0x7開頭,堆區的地址一般以0x6開頭,這兩個區域是函數調用的時候分配,函數執行結束后一般會釋放。BSS區域,常量區域內存在程序運行期間一直存在,直到程序運行結束。
使用iOS工程,寫一個方法testMethod,放入到ViewController的viewDidLoad中,斷點到testMethod可以查看對應的變量。
//文件頭部的靜態變量和全局變量 //static NSInteger test = 1; //const NSString *str = @"hello";- (void)viewDidLoad {[super viewDidLoad];[self testMethod:@"method"]; }- (void)testMethod:(NSString *)param {NSString *local = [[NSString alloc] initWithFormat:@"%@", @"hello world!"];NSString *localstr = [[NSString alloc] initWithFormat:@"%@", @"hello"];//局部變量NSInteger tmpInt = 2;//堆變量NSLog(@"%@", local);//taggedPointerNSLog(@"%@", localstr);//全局變量NSLog(@"%@", str);//靜態變量NSLog(@"%ld", test); }在方法的最后一行打斷點,斷點執行到的時候,右擊debug區域的變量,選擇View Memory of "xxxx"可以看到這個變量的內存地址。這里有個變量比較特殊,局部變量localstr在debug 區域可以看到它是NSTaggedPointerString,也沒有放在堆區。對于這種較短的字符串,蘋果做了優化,沒有將他們放到堆區,而是直接把值寫入到指針中,以便加快訪問速度,并減少內存。
總結
- 上一篇: 设备管理 设备管理概述
- 下一篇: UE4 外部图片导入游戏,并实现保存数据