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代码)