IOS学习第一篇 ——堆和栈的内存分析

IOS学习第一篇 堆和栈的内存分析

object_c的内存是以堆的方式分配的,堆的内存需要自己释放.

栈由编译器自动释放。(函数体定义的变量通常是在栈内的)。

1.栈区(stack):由编译器自动释放,存放函数的参数值,局部变量

2.堆区(heap): 自己释放,如果不释放,就可能会发生内泄漏。(堆的底层是链表)

3.IOS 使用了三个内存区域:"text segment "  ;  "stack segment"  ; "heap segment"

" text segment " :是程序运行时候代码存在的内存段。每一个指令,函数,过程,方法和代码都会存在里面,直到程序退出。

“ stack segment ”:程序开始,main()函数被调用之后,一些空间分配在"stack"中,用来存储函数变量。每一次用函数,都会分配stack的一部分内存。

“heap segment”: 保存全局和静态变量 ,直到程序结束。操作系统使用stack中的指针访问heap中的对象,如果stack对象指针没有了,则heap中的对象不能访问,是内存泄露的原因

stack 对象的创建

只要栈的剩余空间大于stack对象申请创建的空间,系统就会为程序提供内存空间,否则将报栈溢出。

heap对象的创建

系统对于内存heap是用链表管理的,系统有一个记录空闲内存地址的链表,当收到程序申请时,会遍历链表,寻找第一个空间大于所申请heap节点,然后将该节点从闲节点链表中删除,并将该节点的空间分配给程序。

在oc中采用arc机制,让编译器来进行内存管理,在新一代apple llvm编译器中设置arc为有效状态,就无需再次键入retain或release代码)

在内存管理中:  自己生成的对象,自己持有。  
                          不是自己生成的对象,自己也能持有。 
                          不再需要自己持有的对象就是放。 
                          不是自己持有的对象无法释放。
生成并持有对象:alloc/new/copy/mutableCopy     
          持有对象:retain  
          释放对象: release  
          废弃对象: dealloc
这些内存管理是在 cocoa框架 中的foundation框架类库的NSObject类担负的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值