堆栈以及内存分配

1.在IOS中系统是怎么分配变量的?
 1. 内存是所有应用程序共享的
2.内存分配是由系统来分配的
3.系统使用一个链表来维护所有已经分配过得内存空间(把分配过的内存空间用链表连接起来,进行标示)
4.系统只是记录分配了多少字节给应用程序,并不管具体的类型“匿名”
5.如果变量使用结束后,需要释放内存,OC中当一个变量的引用计数为0,就说明没有任何变量使用该空间,系统就直接收回
6.如果程序员变量使用之后不释放内存,该内存区域就会永远被占用,造成内存泄露!
7.野指针,当对象已经被释放,程序中的变量的指针,仍然指向给内存地址,如果再像该对象发送消息,就会报告野指针


2.堆区
地址由小到大,
一个程序要运行的时候,一点击屏幕就会把代码加载到内存中,之后加载常量,
再加载全局区/静态区,此处分两部分,先加载有初始化的变量,再加载未初始化的变量。
(这部分随着程序启动被加载到内存,程序销毁才会被销毁,程序猿不需要管理内存。因此程序开发中要少用全局/静态变量)
变量内存空间都是allock 的,程序员需要管理堆区的内存
ARC的内存管理:编译器在编译的时候,在动添加retain,release,autorelease


3.栈区
存放局部变量,地址从上往下分配,最先分配的变量在程序允许的内存空间的最上面
弹栈 先进后出,一旦出了作用域就会被销毁,程序员不需要管理栈区变量的内存
例如   int i = 10; 
 int j = 20;   
i先进栈,j进栈,i的地址比j大,越往后越小 



4.堆和栈的区别?
1.申请大小:
栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域。
这句话的意思是栈顶的地址和栈的最大容量是 系统预先规定好的,一般是栈的大小是2M
(也有的说是1M,总之是一个编译时就确定的常数),能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。
这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.碎片问题:对于堆来讲,频繁的分配销毁势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
    对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,永远都不可能有一个内存块从栈中间弹出
3.分配方式:堆都是动态分配的,没有静态分配的堆。
栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。
动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
4.分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:
分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值