内存管理
来源:互联网 发布:php证书查询系统 编辑:程序博客网 时间:2024/06/01 18:53
- 内存管理
- 在内存中申请空间,存储数据. 声明1个变量.
- 当数据不再使用的时候,内存中申请的空间就应该被释放.
内存中的五大区域.
- 栈: 存储的是局部变量.局部变量所在的作用域被执行完毕之后.就会被系统立即回收.
堆: 程序员手动申请(malloc calloc realloc)的空间。除非程序员手动释放(free)否则直到程序结束的时候才会被释放.
- OC对象,new或者alloc的时候OC对象就被创建在堆空间.
- OC对象需要被回收吗? 什么时候被回收呢?如何回收呢?
BSS段: 存储未初始化的静态变量、全局变量. 一旦被初始化就从BSS段回收,存储到数据段.
- 数据段: 已经被初始化的静态变量、全局变量.常量数据. 程序结束的时候才会被回收.
- 代码段: 存储代码.直到程序结束的时候才会被回收.
堆中的OC对象是肯定需要被回收的.
iPhone 512 1GB 2GB
40M 警告.
45M 警告.
120M 闪退.内存管理的范围.
- 存储在堆中的OC对象不会自动回收.
- 如果我们创建1个OC对象,这个OC对象的被分配在堆区.
它不会被自动回收. 如果我们不管它的话 它会在程序结束的时候才会被回收掉.
我们需要管理的是: 堆区中的OC对象的释放.
堆区的OC对象的回收.
什么时候应该回收OC对象.
当OC对象不再使用的时候,或者说没有人使用这个对象的时候 这个对象就应该被回收掉.对象的拥有者
- 谁在使用这个对象,谁就是这个对象的拥有者.
- 1个指针指向1个对象 我们就说这个指针是这个对象的拥有者. 这个指针在使用这个对象.
当没有任何指针指向这个对象的时候,就代表这个对象没有任何人在使用它 那么这个时候就应该销毁这个对象.
引用计数器
- 每1个OC对象,都有1个属性 叫做retainCount 类型是unsinged long 占据8个字节. 叫做引用计数器.
- 这个属性的作用:用来记录有多少个人正在使用这个对象.
有1个OC对象.
- 当有1个人使用这个对象的时候,就应该为这个对象的引用计数器+1 代表这个对象多了1个人使用.
当少1个人使用这个对象的时候,就应该为这个对象的引用计数器-1 代表少1个人使用这个对象.
当对象的引用计数器为0的时候. 代表没有人再使用这个对象了,那么这个时候系统就会自动回收这个对象.
- 在对象被回收的时候,会自动调用这个对象的dealloc方法.
操作对象的引用计数器
. 为对象发送1条retain消息. 这个对象的引用计数器就会+1
. 为对象发送1条release消息.这个对象的引用计数器就会-1
. 为对象发送1条retainCount消息.就会得到这个对象的引用计数器的值.
当对象的引用计数器的值为0的时候.系统就会立即回收这个对象 并执行这个对象的dealloc方法.
内存管理的分类.
OC对象的内存管理分为两类.
MRC: Mannul Reference Counting 手动引用计数.
- 程序员手动写代码来改变对象的引用计数器的值.
- 每当多1个人使用对象的时候 手动的为对象发送1条retain消息.
- 当少1个人使用这个对象的时候 手动的为对象发送1条release消息
ARC: Automatic Reference Counting 自动引用计数.
- Xcode编译器自动的改变对象的引用计数器的值.
- 当多1个人使用对象的时候,就自动的为对象发送1条retain消息.
- 少 release.