天天看点

iOS内存管理02-内存布局One More Thing

这一阶段我们主要来讲讲iOS内存管理方面的知识,面试的时候可能大家多多少少都会被问及这方面的问题,那我们就从常见的面试题开讲
  • 使用

    CADisplayLink

    NSTimer

    有什么注意点?
  • 介绍下内存的几大区域
  • 讲一下你对iOS内存管理的理解
  • ARC

    都帮我们做了什么?
  • weak指针

    的实现原理
  • autorelease

    对象在什么时机会被调用

    release

  • 方法里有局部对象,出了方法后会

    立即释放

    吗?

上一篇我们说了

定时器

CADisplayLink

,今天我们来说说第二条,介绍下

iOS的内存布局

iOS内存管理02-内存布局One More Thing

##我们从低向高看依次是

  • 内存的低地址是保留的
  • 代码段(__TEXT)
编译之后的代码
  • 数据段(__DATA)

字符串常量:比如NSString *str = @“123”

已初始化数据:已初始化的全局变量、静态变量等

未初始化数据:未初始化的全局变量、静态变量等

  • 堆(heap)
通过

alloc

malloc

calloc

等动态分配的空间,分配的内存空间地址

越来越大

  • 栈(stack)
函数调用开销,比如

局部变量

。分配的内存空间地址

越来越小

  • 内核区

保留区和内核区我们是用不到的

##下面我们来写代码验证下

我们新建一个工程,我们就直接在main文件里直接写了

int a = 10;
int b;

int main(int argc, char * argv[]) {
    @autoreleasepool {
        static int c = 20;
        
        static int d;
        
        int e;
        int f = 20;

        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\nstr=%p\nobj=%p\n",
              &a, &b, &c, &d, &e, &f, str, obj);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
           

然后我们运行下看终端日志输出

/*
 字符串常量
 str=0x10dfa0068
 
 已初始化的全局变量、静态变量
 &a =0x10dfa0db8
 &c =0x10dfa0dbc
 
 未初始化的全局变量、静态变量
 &d =0x10dfa0e80
 &b =0x10dfa0e84
 
 堆
 obj=0x608000012210
 
 栈
 &f =0x7ffee1c60fe0
 &e =0x7ffee1c60fe4
 */
           

我们可以看到跟我们画的图是一样的

  • 字符串常量的内存地址 < 已初始化的全局变量、静态变量 < 未初始化的全局变量、静态变量 < 堆 < 栈
  • 我们还发现

    全局变量

    静态变量

    的内存地址是

    挨着的

    ,所以我们可以说

    静态变量

    (不管放在那里方法内部也好外部也好)和

    全局变量

    是一样的内存是

    只有一份

    的,编译完以后它们就已经确定了放在了一块的
  • 还有就是我们看到

    数据段

    的地址跨度非常大,所以系统留给我们的

    的空间是

    非常大

  • 还有一点就是由于

    分配的空间地址

    越来越大

    ,而

    分配的空间地址

    越来越小

    ,也就是说

    之间的地址有可能是

    堆空间

    ,也可能是

    栈空间

One More Thing

喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力)

iOS内存管理02-内存布局One More Thing