首页 > 代码库 > OC内存

OC内存

(一)在计算机中,运行的app数据都是保存在内存的。内存分为五大区域

*栈区:由编译器自动分配并释放,存放局部变量,先进后出(弹栈),一旦出了作用域就会被销毁,程序员不管这部分内存

*堆区:由程序员来管理,ARC管理OC对象在堆区,后进先出,堆都是alloc出来的(ARC是编译器在编译的时候自动添加retain,release和autorelease)

*全局区(静态区)(static):全局变量和静态变量是存储在一起的。初始化的在放在一块,未初始化的放在一块,程序结束后由系统释放(所以尽量少用全局/静态变量)

*文字常量区:存放常量字符串,系统释放

*程序代码区:存放函数的二进制代码

当app打开,首先加载到内存的是代码区,随后是常量区(因为定义完了不能改了),随后是全局区/静态区(有初始值的),全局区/静态区(没有初始值的)--------> 这些是随着程序启动,就会自动加载,随着app死亡就被销毁的,所以这部分不需要程序员管理内存。随后加载堆区和栈区。栈区是从上到下分配的,先分配的是程序允许的最高内存,越分配地址越小。而堆区是由小到大分配的。在ios中,堆区的内存是所有应用程序共享的,所以堆中的内存空间是系统来负责的。系统使用一个数据结构链表来维护所有已分配的内存空间。假设一个应用程序Person allocInit了一个*p,并且需要100字节的空间,此时系统就会在没有分配的堆空间里来找出一块大于100字节的空间,然后缩成刚好够用的100字节,再和前面那些别的app用过的空间连起来,行成链表。此时把这个分配的空间的内存地址返回给*p,系统只是分配了多少字节给应用程序,是匿名管理的,是不记录哪个app的哪个Person。当*P变量使用结束了,需要释放了,此时变量引用计数为0,系统看没人用了,就回收了。如果程序员用了不释放,那么就内存泄漏了。(现在ARC的情况下,就看有没有强指针引用这块儿内存,没有就销毁内存)。

OC中内存,除了内存泄漏,还有个更常见的是野指针,就是当对象已经被释放了,系统回收了,而程序中的变量指针还访问这块内存(消息机制),就野指针。

有时候出现bug问题,跟踪一下地址还是很有好处的。

OC内存