iOS 程序内存布局

265 阅读1分钟

iOS 程序的内存布局如下

举例:

int a = 10;   // 已初始化全局变量(数据段)
int c;        // 未初始化的全局变量(数据段)

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        
        static int b = 20;     // 已初始化的静态变量(数据段)
        static int d;          // 未初始化的静态变量(数据段)
        
        int e = 30;            // 局部变量(栈区)
        int f;                 // 局部变量(栈区)
        
        NSString *str = @"123"; // 字符串常量区(数据段)
        
        NSObject *obj = [[NSObject alloc] init];   // 堆区
        
        NSLog(@"\n&a=%p\n&b=%p\n&c=%p\n&d=%p\n&e=%p\n&f=%p\n&str=%p\n&obj=%p\n", &a, &b, &c, &d, &e, &f, str, obj);
        
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

打印结果如下:

&str=0x1050f1040  // 数据段的字符串常量,地址相对较小

&a=0x1050f3520   // 数据段已初始化的全局变量
&b=0x1050f3524   // 数据段已初始化的静态变量

&c=0x1050f35ec   // 未初始化的全局变量(数据段)
&d=0x1050f35e8   // 未初始化的静态变量(数据段)

// 可以看出,分配的地址越来越小
&e=0x7ffeeab0fcc4  // 局部变量(栈区)
&f=0x7ffeeab0fcc0  // 局部变量(栈区)   
 
&obj=0x6000011cc110  // 对象(堆区)