参考:
1、http://ios.jobbole.com/81900/
2、https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap
3、https://vikashazrati.wordpress.com/2007/10/01/quicktip-java-basics-stack-and-heap/
4、https://www.solstice.com/blog/blocks-and-memory-management-stack-vs-heap
5、https://stackoverflow.com/questions/2067126/program-stack-and-heap-how-do-they-work
6、http://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html
7、https://www.pctechguide.com/computer-memory
8、http://www.tenouk.com/ModuleW.html(内存分为那些类型)
9、https://en.wikipedia.org/wiki/.bss
10、https://en.wikipedia.org/wiki/Data_segment
在学ios开发过程中需要懂得堆变量与栈变量的区别,应用程序的内存分为哪几类。一下将围绕自己的几个问题来做一个简单的说明
1、什么是堆,什么是栈 2、什么是堆变量, 什么是栈变量 3、block 变量是堆变量还是栈变量,在将block赋值是发生了什么 4、程序加载到内存中是加载到堆中还是栈中 ,宏定义,Const 常量定义如何加载的,加载到哪里。
1、堆与栈
* 栈是线程执行过程中存放在低地址位缓存数据的一个内存块,其读写速度是最快的,一个线程对应一个这样的内存块,栈是先进后出的结构,其数据大小是固定的,因此栈中不存在两个变量间有“内存间隙”,由于这个特性,也不需要自己手动释放内存,栈的大小比堆小,一旦一个函数执行的时候它需要的参数就会被推进栈中,一旦函数执行完后这个函数和它的参数就会被推出栈中,这样确保了栈的内存的回收。栈可能会有栈溢出的问题,如果出现了栈溢出,那么程序将会崩溃。
* 堆是程序执行过程中的公共内存区域,每个程序有一个唯一的堆,这个堆可以由这个程序的多个线程共同访问。堆的大小是可以动态分配的。一般堆分配内存需要通过alloc ,copy等关键子来修饰
2、堆变量和栈变量是针对变量的内存位置而言的,堆变量就是内存在堆中的变量,栈变量是内存在栈中的变量。
3、block对象变量通常在初始化的过程中是分配在栈中的,但是由于block可以作为参数传递,这个传递的过程是由状态的,但是栈并不会负责帮你把block retain住,所以当对一个block对象在一个作用域传递到另外一个作用域中的时候其实系统会把这个block保存到堆中(arc中会自动这么做,假如不是arc的话就要自己做这种处理,否则会出现异常), 这种传递包括作用域发生改变后的变量传递和属性赋值。
4、要知道问题四需要先了解一个应用的内存分为哪几种:
a、Code - text segment (代码保存的位置)
b、Initialized data – data segment (静态变量,包括全局变量,静态局部变量)
c、Uninitialized data – bss segment (Basic Service Set,部分静态数据在初始化的时候才会被分配到bss中,在嵌入式软件系统中这部分数据在main函数运行前通过run time加载到内存中,compiler,linker的操作)
d、Heap (对象分配内存 malloc ,alloc ,copy)
e、Stack (系统的局部变量,函数参数传值)
盗一张图阐述一下:
总结:通过以上的分析影响应用的运行速度与效率的 内存是Heap的内存分配操作 ,Stack的数量和传参; 影响程序启动速度的是:a,b,c。(这些都需要加载)