堆&栈, 内存分配

1. 堆&栈 

 iOS程序加载时的内存顺序,首先是加载的代码区, 其次是常量区,加载之后不能修改,然后是初始化之后的全局区/静态区, 再是没有初始化的全局区/ 静态区 ---------以上几个部分是随着程序的启动加载到内存中,随着程序的销毁才从内存中销毁, 程序员不需要管理这部分内存!而且, 要尽量少使用全局变量,因为它从一加载就在内存中。

  然后,是堆区,先进先出, 内存地址由小到大。堆区的变量内存空间分配都是使用alloc,程序员需要管理堆区的内存。ARC 的内存管理,是编译器在编译的时候,自动添加 retain,release,autorelease

  然后,是栈区,先进后去,内存地址由大到小。存放局部变量,一旦出了作用域就会被销毁,程序要不需要管理栈区内存

示意图:   

 

2.内存分配

  1. iOS中堆区的内存是所有应用程序共享的

  2.堆中的内存分配是有系统来负责的

  3.系统使用一个链表是维护已经分配过的内存

  4.系统只是记录分配了多少字节给应用程序,并不管理具体的类型“匿名”

  5.变量使用结束后,需要释放内存。 OC中当一个变量的引用计数为0 的时候,说明没有任何变量指向该空间,系统就会直接收回

  6.内存泄露, 如果变量使用之后, 不释放内存,该内存区域永远被占用,就会造成内存泄露

  7.野指针,当对象被释放,变量的指针仍然指向该内存地址,如果向该对象发送消息,就会发生野指针错误

posted @ 2015-05-22 00:25  杨智帆  阅读(139)  评论(0编辑  收藏  举报