区块链技术博客
www.b2bchain.cn

iOS面试题目解析07 – 内存基础求职学习资料

本文介绍了iOS面试题目解析07 – 内存基础求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

1. 内存中的5大区分别是什么?

  • 栈区 Stack:存放函数的参数值、局部变量的值等,从高地址向低地址生长。其操作方式为FIFO,由编译器自动分配释放,不需要程序员管理。

  • 堆区 Heap:动态内存分配区域,通过 alloc 分配,从高地址向低地址生长。

  • 全局区/静态区 Static:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

    // 未初始化的 int a;  // 已初始化的 int b = 100;
  • 常量区:常量字符串就是放在这里的。 程序结束后由系统释放。

  • 代码区:存放函数体的二进制代码。

iOS面试题目解析07 - 内存基础

堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;系统使用一个链表来维护所有已经分配的内存空间(系统仅仅纪录,并不管理具体的内容);变量使用结束后,需要释放内存,ObjC中是根据引用计数==0,就说明没有任何变量使用该空间,那么系统将直接收回;

当一个app启动后,代码区,常量区,全局区大小已固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)。

堆区和栈区的区别?

  • 申请方式:栈区由系统自动分配,自动释放,无需程序员管理;堆区是动态内存分配区域,由程序员申请和释放。

  • 生长方向:栈区从高地址向低地址生长,堆区相反

2. 什么是悬垂指针?什么是野指针?

  • 悬垂指针 Dangling Pointer: 指针指向的内存已经被释放了,但是指针还存在,这就是一个 悬垂指针 或者说 迷途指针

  • 野指针 Wild Pointer:没有进行初始化的指针,其实都是野指针

3. BAD_ACCESS 在什么情况下出现?

访问了已经被销毁的内存空间,就会报出这个错误。 根本原因是有 悬垂指针 没有被释放。

1. 内存中的5大区分别是什么?

  • 栈区 Stack:存放函数的参数值、局部变量的值等,从高地址向低地址生长。其操作方式为FIFO,由编译器自动分配释放,不需要程序员管理。

  • 堆区 Heap:动态内存分配区域,通过 alloc 分配,从高地址向低地址生长。

  • 全局区/静态区 Static:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

    // 未初始化的 int a;  // 已初始化的 int b = 100;
  • 常量区:常量字符串就是放在这里的。 程序结束后由系统释放。

  • 代码区:存放函数体的二进制代码。

iOS面试题目解析07 - 内存基础

堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;系统使用一个链表来维护所有已经分配的内存空间(系统仅仅纪录,并不管理具体的内容);变量使用结束后,需要释放内存,ObjC中是根据引用计数==0,就说明没有任何变量使用该空间,那么系统将直接收回;

当一个app启动后,代码区,常量区,全局区大小已固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)。

堆区和栈区的区别?

  • 申请方式:栈区由系统自动分配,自动释放,无需程序员管理;堆区是动态内存分配区域,由程序员申请和释放。

  • 生长方向:栈区从高地址向低地址生长,堆区相反

2. 什么是悬垂指针?什么是野指针?

  • 悬垂指针 Dangling Pointer: 指针指向的内存已经被释放了,但是指针还存在,这就是一个 悬垂指针 或者说 迷途指针

  • 野指针 Wild Pointer:没有进行初始化的指针,其实都是野指针

3. BAD_ACCESS 在什么情况下出现?

访问了已经被销毁的内存空间,就会报出这个错误。 根本原因是有 悬垂指针 没有被释放。

1. 内存中的5大区分别是什么?

  • 栈区 Stack:存放函数的参数值、局部变量的值等,从高地址向低地址生长。其操作方式为FIFO,由编译器自动分配释放,不需要程序员管理。

  • 堆区 Heap:动态内存分配区域,通过 alloc 分配,从高地址向低地址生长。

  • 全局区/静态区 Static:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

    // 未初始化的 int a;  // 已初始化的 int b = 100;
  • 常量区:常量字符串就是放在这里的。 程序结束后由系统释放。

  • 代码区:存放函数体的二进制代码。

iOS面试题目解析07 - 内存基础

堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;系统使用一个链表来维护所有已经分配的内存空间(系统仅仅纪录,并不管理具体的内容);变量使用结束后,需要释放内存,ObjC中是根据引用计数==0,就说明没有任何变量使用该空间,那么系统将直接收回;

当一个app启动后,代码区,常量区,全局区大小已固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)。

堆区和栈区的区别?

  • 申请方式:栈区由系统自动分配,自动释放,无需程序员管理;堆区是动态内存分配区域,由程序员申请和释放。

  • 生长方向:栈区从高地址向低地址生长,堆区相反

2. 什么是悬垂指针?什么是野指针?

  • 悬垂指针 Dangling Pointer: 指针指向的内存已经被释放了,但是指针还存在,这就是一个 悬垂指针 或者说 迷途指针

  • 野指针 Wild Pointer:没有进行初始化的指针,其实都是野指针

3. BAD_ACCESS 在什么情况下出现?

访问了已经被销毁的内存空间,就会报出这个错误。 根本原因是有 悬垂指针 没有被释放。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS面试题目解析07 – 内存基础求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们