堆和栈
全局(静态)区
存放程序静态分配的变量和全局变量。
栈区(stack)
由编译器自动分配并释放
存放函数的参数值,局部变量等
当一个方法执行时,会建立自己的内存栈,在这方法内定义的变量,局部变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。
栈一般来说都是一个先进后出的队列,后进入的数据,会被先释放掉.栈区存放函数内的局部变量,形参和函数返回值.栈区的内存由系统自动管理释放,内存的分配是连续的,且分配的内存地址是向下增长.申明的变量过了作用域范围后内存便会自动释放,不需要开发人员手动管理.
堆区(heap)
大部分自定义的类都在堆中
比如在ios 中 alloc 都是存放在堆中。
在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。
堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量指向它时,系统的垃圾回收器才会在合适的时候回收它。
iOS中数据是存在堆和栈中的,然而我们的内存管理管理的堆上的内存,栈上的内存并不是我们管理
非OC对象(基础数据类型)存储在栈上
OC对象存储在堆上