01、简介
内存是与CPU沟通的桥梁,计算机程序运行在内存,因此对内存的使用进行优化极为重要
02、内存管理说明
2.1 主要分类
内存管理主要分为自动内存管理和手动内存管理两大类
2.2 自动内存管理
2.2.1 由系统自动管理内存的方式,叫做自动内存管理
2.2.2 一些编程语言将自动内存管理称为垃圾回收,如Java
2.3 手动内存管理
由开发者写代码管理内存的方式,叫做手动内存管理
03、开发中内存常见的问题
内存泄露:就是程序中对象使用完毕后,并没有释放内存,就会造成内存泄露
内存溢出:内存不够用的情况叫做内存溢出
04、iOS内存管理
4.1 范围
任何直接或间接继承自NSObject的对象,基础数据类型不需要管理
4.2 引用计数
4.2.1 原理
1> 每个对象内部有一个与内存相关的数,叫做引用计数
2> 引用计数为0,对象被销毁,它占用的内存被回收,程序结束内存也会被回收
3> 引用计数占4个字节
4.2.2 操作
1> retain,引用计数+1
2> release,引用计数-1
3> retainCount,获得对象当前的引用计数
4.2.3 原则
1> 谁创建、谁释放
使用alloc、new、copy、mutableCopy创建的对象,需要release或autorelease
一般情况下,alloc、new、copy之外的方法创建的对象使用autorelease
2> 谁retain,谁release
只要调用retain,必须调用release,无论该对象怎样创建的
3> alloc、new、copy创建的对象引用计数默认为1
05、dealloc方法
1.不能人为调用,只能由系统调用
2.重写dealloc方法时,需要释放相关资源,即对self所拥有的其他资源release
3.对象的引用计数为0时,系统自动调用dealloc方法
4.重写dealloc方法时,[super dealloc];必不可少,并且要放到最后
5.只在MRC下使用
06、@property属性的内存管理关键代码
// 不考虑多线程的情况 @property IdentityCard *card; - (void)setCard:(IdentityCard *)card { if (card != _card) { [_card release]; _card = [card retain]; } } - (void)dealloc { [_card release]; [super dealloc]; }
07、@property属性的内存管理的处理
7.1 内存管理相关属性,即setter
assign:直接赋值,适用于非OC对象类型
retain:release旧值,retain新值,适用于OC对象
copy:release旧值,copy新值,适用于OC对象
7.2 读写属性,即是否生成setter、getter
readwrite:同时生成setter、getter的声明和实现
readonly:只生成getter声明和实现
7.3 线程管理
atomic:多线程操作,性能较低
nonatomic:非多线程操作,性能较高
7.4 方法别名
setter:setter起别名,必须使用:
getter:getter起别名,多用于BOOL类型
08、处理循环引用
1.两个对象相互引用的时候,一端使用assign,一端使用retain
2.使用assign修饰的其中一个对象不能使用release,因为assign代表基础数据类型
09、autorelease pool(自动释放池)
9.1 简介
1.自动释放池是延迟释放对象的一种方式
2.自动释放池销毁时,池内的对象的引用计数-1,即release,对象不一定被回收
9.2 优缺点
优点:不关心对象的释放时间,不用关心什么时候release
缺点:不能精确的控制对象释放的时间
10、iOS的自动内存管理
10.1 简介
iOS自动内存管理,即ARC,Automatic Reference Counting,自动引用计数
ARC的本质是MRC,由编译器插入retain、release、autorelease、dealloc等方法
10.2 指针类型
强指针
强指针指向的对象在程序结束之前不会被回收,是默认的类型
弱指针
弱指针指向的对象如果被回收,弱指针会自动置为nil
10.3 判断准则
只要没有强指针指向对象,该对象就会被回收
10.4 注意事项
1.不允许使用release、retain方法
2.能够调用dealloc方法,但是不允许调用[super dealloc];
11、ARC下的@property
1、strong:相当于MRC下的retain,适用于OC对象类型
2、weak:相当于MRC下的assign,适用于OC的对象类型
3、assign:使用于OC的基础数据类型
4、之前的retain改用strong
12、MRC与ARC转换
整个项目MRC向ARC转换
Edit -> Refactor -> Convert Objective-C ARC... -> Check -> Next -> Save -> Enable
某个文件ARC向MRC转换
选中蓝色的项目 -> 选中Build Phases -> 点开Compile Sources -> 找到需要转换的文件双击输入-fno-objc-arc
某个文件MRC向ARC转换
选中蓝色的项目 -> 选中Build Phases -> 点开Compile Sources -> 找到需要转换的文件双击输入-f-objc-arc