当前位置: 首页 > news >正文

嘉兴装修公司做网站中国十大营销策划公司排名

嘉兴装修公司做网站,中国十大营销策划公司排名,廊坊做网站企业教程,新网站怎么做外链iOS内存五大分区 总揽 iOS中#xff0c;内存主要分为五大区域#xff1a;栈区#xff0c;堆区#xff0c;全局区/静态区#xff0c;常量区和代码区。总览图如下。 这个图我觉得更好记#xff0c;因为下面是低地址#xff0c;上面是高地址#xff0c;是比较符合日常…iOS内存五大分区 总揽 iOS中内存主要分为五大区域栈区堆区全局区/静态区常量区和代码区。总览图如下。 这个图我觉得更好记因为下面是低地址上面是高地址是比较符合日常逻辑的。 由下到上开始背代码区常量区全局/静态区堆区向上生长栈区向下生长内核区 如上图所示代码区是在低地址段存放而栈区则存放在高地址段并且各个分区之间不是连续的。 栈区 1.1 介绍 栈是从高地址向低地址存储的一块连续的内存区域特点是先进后出(FILO)栈的地址空间在iOS里面 0X7 / 0X16 开头栈区一般是在 运行时分配内存内存空间由系统管理, 也就是变量超出了自身的作用范围之后就会被释放包含 函数内部定义的局部变量以及方法参数方法的默认参数self、cmd等也都是存放在栈区 1.2优缺点 注意栈区的内存是由系统分配并管理的所以它会由系统分配并自己释放不会产生内存碎片更快更高效。但是栈的内存大小被系统所限制导致其并不是很灵活iOS主线程栈道大小1MB其他线程512KBMac为8M。 - (void)testStack {int a 10;NSLog(a %p size %lu,a,sizeof(a));NSLog(方法参数 self%p,self);NSLog(方法参数 cmd%p,_cmd); }可以看出栈内存的分配是连续的参数如栈顺序为self, _cmd, a。然后地址的大小变化为0x16b8cba28 - 0x16b8cba20 - 0x16b8cba1c 可以看出由高地址到低地址一次递减8字节 堆区 堆是从低地址向高地址的不连续的内存区域和链表的结构很相似便于增删但不便于查询特点是先进先出FIFO堆地址是以0x6开头动态的分配空间在堆里面存放的东西需要我们手动的管理和释放若不及时释放就会造成内存泄漏在OC里面alloc和new都会为对象开辟空间到堆上 - (void)testHeap {NSObject *object1 [NSObject new];NSObject *object2 [NSObject new];NSLog(object1 %,object1);NSLog(object2 %,object2); }可以看出堆内存分配是 不连续的 栈和堆的区别联系 各自的优缺点 栈由编译器自动分配并释放速度较快不会产生内存碎片。优点是快速高效缺点是有限制数据不灵活。堆 由程序员分配和释放速度比较慢而且容易产生内存碎片不过用起来最方便。优点是灵活方便数据适应面广泛但是效率有一定降低 申请后的系统如何响应 栈存储每一个函数在执行的时候都会向操作系统索要资源栈区就是函数运行时的内存栈区中的变量由编译器负责分配和释放内存随着函数的运行分配随着函数的结束而释放由系统自动完成。只要栈的剩余空间大于所申请空间系统将为程序提供内存否则将报异常提示栈溢出。堆操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时会遍历该链表寻找第一个空间大于所申请空间的堆结点然后将该结点从空间结点链表中删除并将该结点的空间分配给程序。由于找到的堆结点的大小不一定正好等于申请的大小系统会自动的将多余的那部分重新放入空闲链表中。 申请大小的限制 栈 栈是向低地址扩展的数据结构是一块连续的内存的区域。栈顶的地址和栈的最大容量是系统预先规定好的栈的大小是2M有的说是1M总之是一个编译时就确定的常数如果申请的空间超过栈道剩余空间时将提示overflow。因此能从栈获得的空间较小。堆 堆是向高地址扩展的数据结构是不连续的内存区域。这是由于系统是用链表来存储空闲内存地址的自然是不连续的而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见堆获得的空间比较灵活也比较大。 全局/静态区 该区是编译时分配的内存空间在iOS中一般以0x1开头在程序运行过程中此内存中的数据一直存在程序结束后由系统释放。未初始化的全局变量和静态变量即BSS区.bss。已初始化的全局变量和静态变量即数据区.data。 其中全局变量是指变量值可以在运行时被动态修改而静态变量是static修饰的变量包含静态局部变量和静态全局变量 int clB; static int bssB; int initClB 10; static int initBssB 11; - (void)testStatic {NSLog(clA %p, clB);NSLog(bssB %p, bssB);NSLog(initClB %p, initClB);NSLog(initBssB %p, initBssB); }结论 clB 和 bssB都是未初始化在内存是连续的地址相差为4。 initClB和 initBssB都是初始化的数据内存地址也是连续的也相差4。 常量区 该区是编译时分配的内存空间在程序运行过程中此内存中的数据一直存在程序结束后由系统释放。存放常量 整形、字符型、浮点、字符串等常量区是编译时分配的内存空间在程序结束后由系统释放主要存放 已经使用了的且没有指向的字符串常量字符串常量因为可能在程序中被多次使用所以在程序运行之前就回提前分配内存。 代码区 该区时编译时分配的内存空间在程序运行过程中此内存中的数据一直存在程序结束后由系统释放程序运行时的代码会被编译成二进制存进内存的代码区域 面试题 讲一下static关键字的各种情况以及作用 答 对于全局变量来说static 改变了其作用域。普通全局变量是所有文件都可以用。静态全局变量是只有当前文件可以用。对于局部变量来说static改变了其存储方式从而改变了生命周期。普通局部变量是动态存储动态存储决定了其生命周期为变量使用期间。静态局部变量是静态存储存储在全局静态区生命周期为从程序开始道结束。因此 static 这个说明符在不同的地方所起的作用是不同的。总结全局变量、静态全局变量、静态局部变量采用静态存储方式局部变量采用动态存储方式。 更详细文章看这里 iOS的static修饰符 问题1请简述iOS应用程序的五大内存分区及其主要用途。 答案 iOS应用程序的内存分为以下五个主要分区 1. **栈Stack**- **用途**用于存储局部变量、函数参数、返回地址等。栈内存是自动分配和释放的主要用于函数调用和局部变量的管理。- **特点**内存分配方式为LIFO后进先出存取速度快空间相对较小。2. **堆Heap**- **用途**用于动态分配内存存储需要在运行时分配和释放的对象和数据。堆内存由程序员手动管理通过malloc、free、 new、delete等函数进行分配和释放。- **特点**内存管理灵活存储空间较大但分配和释放速度相对较慢容易产生内存碎片。3. **全局区/静态区Global/Static**- **用途**存储全局变量和静态变量。全局变量在程序启动时分配在程序结束时释放静态变量在第一次使用时分配程序结束时释放。- **特点**内存地址固定生命周期贯穿程序运行的整个周期。4. **常量区Constant**- **用途**存储常量数据例如字符串常量、数值常量等。常量区的内容在程序运行时不可修改。- **特点**只读区域数据在程序加载时初始化生命周期贯穿程序运行的整个周期。5. **代码区Code/Text**- **用途**存储程序的可执行代码包括函数体和编译后的指令。代码区在程序运行时是只读的以防止意外修改。- **特点**只读区域存储的是编译后的机器指令生命周期贯穿程序运行的整个周期。问题2为什么栈内存的分配和释放速度比堆内存快 答案 1. 分配方式栈内存采用LIFO后进先出的分配方式每次函数调用时函数的局部变量、参数和返回地址会依次入栈函数返回时这些数据会依次出栈。分配和释放只需要移动栈指针操作简单且高效。 2. **内存管理**栈内存由系统自动管理函数调用结束时系统会自动释放栈内存无需程序员手动管理。堆内存则需要程序员手动管理通过malloc、free等函数进行分配和释放管理复杂且容易产生内存碎片。3. **空间连续**栈内存通常是连续的内存块分配和释放时不需要进行复杂的内存碎片整理而堆内存由于频繁的分配和释放容易产生内存碎片导致分配和释放速度变慢。问题3什么是内存碎片如何在iOS开发中避免内存碎片 答案 内存碎片是指由于频繁的内存分配和释放导致堆内存中出现大量无法使用的小块空闲内存从而降低内存利用效率和分配速度。 在iOS开发中避免内存碎片的方法包括 1. **使用自动内存管理**iOS使用ARCAutomatic Reference Counting来自动管理内存减少手动分配和释放内存的操作从而降低产生内存碎片的风险。2. **对象池技术**对于频繁使用的对象可以使用对象池Object Pool技术将对象复用而不是每次都创建新的对象从而减少内存分配和释放的次数。3. **尽量避免频繁的内存分配和释放**对于需要频繁分配和释放内存的操作可以考虑优化算法或数据结构减少内存分配和释放的频率。4. **使用合适的数据结构**在设计数据结构时尽量使用内存连续的数据结构例如数组、链表等避免过度使用需要频繁分配和释放内存的复杂数据结构。问题4全局区和静态区的内存是如何管理的它们之间有什么区别 答案 全局区和静态区的内存管理方式如下 - **全局区Global**- 管理全局变量即在程序的整个生命周期内都存在的变量。这些变量在程序启动时分配内存在程序结束时释放内存。- 全局变量在定义时如果未显式初始化系统会将其初始化为0。- **静态区Static**- 管理静态变量即在函数或类内部定义并带有static关键字的变量。这些变量在第一次使用时分配内存在程序结束时释放内存。- 静态变量在第一次定义时如果未显式初始化系统也会将其初始化为0。**区别** - **生命周期**全局变量和静态变量的生命周期相似都是在程序运行期间存在但全局变量在程序启动时即被初始化而静态变量在第一次使用时才被初始化。 - **作用域**全局变量的作用域是整个程序而静态变量的作用域仅限于其定义的函数或类内部。问题5代码区是只读的这对程序安全性有什么影响 答案 代码区是只读的这对程序的安全性有以下影响 1. **防止代码篡改**代码区的只读属性确保了程序在运行时代码段不能被修改从而防止恶意代码注入和篡改。这提高了程序的安全性防止了病毒和恶意软件的攻击。2. **保护执行环境**由于代码段是只读的任何对代码区的写操作都会引发异常从而防止意外或恶意修改代码指令保证了程序的稳定运行。3. **避免缓冲区溢出攻击**许多攻击技术例如缓冲区溢出攻击试图通过修改程序的执行路径来执行恶意代码。代码区的只读属性可以有效防止这些攻击因为即使攻击者试图修改代码系统也会检测到并阻止操作。
http://www.w-s-a.com/news/88705/

相关文章:

  • 建设部网站 干部学院 一级注册建筑师培训 2014年做网站开发的提成多少钱
  • 网上请人做软件的网站铝合金型材外发加工网
  • 手机网站建设万网山东省作风建设网站
  • 网站策划专员招聘50万县城做地方网站
  • 网站开发公司+重庆wordpress自定义搜索界面
  • 梅州南站学校官网
  • 网站变灰代码 所有浏览器企业邮箱域名怎么填写
  • 网站建设哪好旅行社网站模板
  • 网站开发发展存在的问题交换链接营销的经典案例
  • 烟台高端网站建设公司福田市网站建设推广
  • 做网站如何保证询盘数量智慧城市
  • 大连网站平台研发wordpress更改地址
  • 做标书要不要做网站南昌网站排名优化费用
  • 网站内容如何自动关联新浪微博万网域名信息
  • 网站出售网络推广服务费计入什么科目
  • 宁波咨询网站设计西安网站制作开发
  • 深圳市专注网站建设全网营销网络推广
  • 如何快速建设网站虚拟空间软件
  • 一个虚拟主机可以做几个网站免费软件下载中心
  • 美工培训网站中国建筑网官网手机版
  • 创建网站花钱吗谁能给个网址免费的
  • 宁波教育学会网站建设网站建设价格由什么决定
  • 北京定制网站价格wordpress上传pdf文档
  • 网站建设费税率dz论坛seo设置
  • 推销网站话术商业网站开发与设计
  • 金华网站建设哪个网站做欧洲旅行比较好
  • 东莞市住房和城乡建设局网站trswcm网站建设
  • 郑州做网站企业h5编辑器免费版
  • 加强公司窗口网站建设陕西省外省入陕建筑信息平台
  • 成都网站优化实战大连企业网站建设模板