iOS内存管理02-内存布局

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

  • 使用CADisplayLink、NSTimer有什么注意点?
  • 介绍下内存的几大区域
  • 讲一下你对iOS内存管理的理解
  • ARC 都帮我们做了什么?
  • weak指针 的实现原理
  • autorelease 对象在什么时机会被调用release
  • 方法里有局部对象,出了方法后会立即释放吗?

上一篇我们说了定时器和CADisplayLink,今天我们来说说第二条,介绍下iOS的内存布局

iOS内存管理02-内存布局

内存布局

我们从低向高看依次是

  • 内存的低地址是保留的
  • 代码段(__TEXT)

编译之后的代码

  • 数据段(__DATA)

字符串常量:比如NSString *str = @"123"已初始化数据:已初始化的全局变量、静态变量等未初始化数据:未初始化的全局变量、静态变量等

  • 堆(heap)

通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大

  • 栈(stack)

函数调用开销,比如局部变量。分配的内存空间地址越来越小

  • 内核区

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

下面我们来写代码验证下

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

<code>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]));
}
}
/<code>

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

<code>/*
字符串常量
str=0x10dfa0068

已初始化的全局变量、静态变量
&a =0x10dfa0db8
&c =0x10dfa0dbc

未初始化的全局变量、静态变量

&d =0x10dfa0e80
&b =0x10dfa0e84


obj=0x608000012210


&f =0x7ffee1c60fe0
&e =0x7ffee1c60fe4
*/
/<code>

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

  • 字符串常量的内存地址 < 已初始化的全局变量、静态变量 < 未初始化的全局变量、静态变量 < 堆 < 栈
  • 我们还发现全局变量和静态变量的内存地址是挨着的,所以我们可以说静态变量(不管放在那里方法内部也好外部也好)和全局变量是一样的内存是只有一份的,编译完以后它们就已经确定了放在了一块的
  • 还有就是我们看到数据段到堆和栈的地址跨度非常大,所以系统留给我们的堆和栈的空间是非常大的
  • 还有一点就是由于堆分配的空间地址越来越大,而栈分配的空间地址越来越小,也就是说堆和栈之间的地址有可能是堆空间,也可能是栈空间

One More Thing

如果您喜欢可以关注我多多点赞,您的支持是我写作的最大动力


分享到:


相關文章: