iOS程序内存分布
iOS的程序內(nèi)存分為五大區(qū)域,分別為棧,堆,BSS,全局變量,代碼區(qū)。
| 運(yùn)行時(shí)分配 | 棧 | 局部變量,函數(shù)參數(shù) |
| 運(yùn)行時(shí)分配 | 堆 | 程序代碼new出的對(duì)象 |
| 編譯時(shí)分配 | BSS | 靜態(tài)變量,未初始化的全局變量 |
| 編譯時(shí)分配 | 數(shù)據(jù)段 | 已經(jīng)初始化的全局變量,常量 |
| 編譯時(shí)分配 | 代碼段 | 程序二進(jìn)制代碼 |
棧區(qū)的地址一般以0x7開(kāi)頭,堆區(qū)的地址一般以0x6開(kāi)頭,這兩個(gè)區(qū)域是函數(shù)調(diào)用的時(shí)候分配,函數(shù)執(zhí)行結(jié)束后一般會(huì)釋放。BSS區(qū)域,常量區(qū)域內(nèi)存在程序運(yùn)行期間一直存在,直到程序運(yùn)行結(jié)束。
使用iOS工程,寫(xiě)一個(gè)方法testMethod,放入到ViewController的viewDidLoad中,斷點(diǎn)到testMethod可以查看對(duì)應(yīng)的變量。
//文件頭部的靜態(tài)變量和全局變量 //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);//靜態(tài)變量NSLog(@"%ld", test); }在方法的最后一行打斷點(diǎn),斷點(diǎn)執(zhí)行到的時(shí)候,右擊debug區(qū)域的變量,選擇View Memory of "xxxx"可以看到這個(gè)變量的內(nèi)存地址。這里有個(gè)變量比較特殊,局部變量localstr在debug 區(qū)域可以看到它是NSTaggedPointerString,也沒(méi)有放在堆區(qū)。對(duì)于這種較短的字符串,蘋(píng)果做了優(yōu)化,沒(méi)有將他們放到堆區(qū),而是直接把值寫(xiě)入到指針中,以便加快訪問(wèn)速度,并減少內(nèi)存。
總結(jié)
- 上一篇: 设备管理 设备管理概述
- 下一篇: UE4 外部图片导入游戏,并实现保存数据