内存管理
- 内存中的五大区域
1.栈区
存储局部变量的区域
出了作用域之后就会被系统立即回收
2.堆区
存储的是OC对象 程序员手动申请的连续字节空间 需要调用free函数来释放
3.BSS段
未初始化的全局变量 静态变量
(一旦初始化就会从BSS段中回收掉,转存到数据段中)
4.数据段
初始化后的全局变量 静态变量 常量数据
(直到程序结束后才会被回收)
5.代码块
- 内存管理的范围
1.只需要管理堆区中的oc对象的释放
2.除了堆区中的oc对象,其他区域中的数据都是系统自动释放的
3.如果程序员不主动释放它的话,将会一直到程序结束的时候才会被释放
这样就会大量占用内存空间会导致系统崩溃
4.当oc对象无人使用的时候,我们就要释放这个oc对象节省内存
- 引用计数器(retainCount)
每一个oc对象都有一个引用计数器属性 它的类型是unsigned long类型(占据8个字节)
作用:用来记录这个对象有多少个人在使用它
1.当我们新创建1个对象出来的时候,这个对象的引用计数器的默认值是1
2.当这个对象多1个人使用的时候,就应该先让这个对象的引用计数器+1
3.当这个对象少1个人使用的时候,就应该先让这个对象的引用计数器-1
4.当这个对象的引用计数器的值为0的时候,系统就会立即自动的回收这个对象
在回收这个对象的同时,会自动的调用这个对象的dealloc方法.
==(少一个人使用就代表当前现在这个对象不再使用了就先让它-1 多一个人使用就是多了一个新的对象 先给它+1 创建的时候默认为1 当我用到那个对象的时候要先给当前对象加1之前的那个对象要-1)==
==即:release旧值 retain新值==
- 如何操作引用计数器
1. 为对象发送1条retain消息. 那么这个对象的引用计数器的值就会+1
2. 为对象发送1条release消息. 这个对象的引用计数器的值就会-1
3. 为对象发送1条retainCount消息.就可以得到这个对象的引用计数器的值.
内存管理的分类
- MRC(Manual Reference Counting)手动引用计数
当对象多1个人使用的时候.程序员要写1句代码来让这个对象的引用计数器+1
当对象少1个人使用的时候.程序员要写1句代码来让这个对象的引用计数器-1
需要程序员手动的写代码来改变对象的引用计数器的值.
- ARC(Automatic Reference Counting)自动引用计数
系统自动的帮助我们去计算对象的引用计数器的值
ARC是新的LLVM3.0编译器的一项特性,解决了手动管理内存的麻烦.
可以说是WWDC2011和iOS5引入的最大的变革和最激动人心的变化
当ARC开启时, 编译器会自动的在合适的地方插入retain、release、autorelease代码.
编译器自动为对象做引用计数
==Xcode6开始默认使用ARC==
网友评论