内存管理的法则
1.凡是用alloc,retain,new(或使用new开头的方法),copy(或使用copy开头的方法),mutableCopy(或使用mutableCopy开头的方法)【创建】的对象,都必须使用release或autorelease方法【释放】
Δ2.谁创建谁释放(哪个类创建,哪个类释放;谁写alloc,谁写release)。
释放对象,可以释放其所占的内存,规则是:不再使用创建或者保持的对象时,就释放它们。 2、发送一条 release 消息不一定销毁对象,只有引用计数变为0 时,才销毁这个对象。系统向
对象发送一条 dealloc 消息来释放它所占的内存。 3、自动释放池在释放池本身的时候自动释放池中的对象。系统向每个对象发送一条release 消
息,对引用计数变为 0 的对象发送一条 dealloc 消息来释放它所占的内存。 4、若你的方法中不再需要一个对象时,但需要返回它,可发送一条autorelease 消息来加入自
动释放池。
5、若使用 alloc 或 copy 方法(或使用 allocWithZone:、copyWithZone:或 mutableCopy 方法
来直接创建对象,则由你负责释放它。每次retain 对象时,应该 release 或 autoreleas 它。
内存管理的黄金法则是在MRC情况下使用
在ARC状态下,系统编译的时候,会自动释放
【自动内存管理ARC】
从Xcode5以后,默认自动内存管理
automatic reference counting;
自动引用计数
简单点说就是让编译器完成堆空间的引用计数加减,自动释放。程序员不再写 retain release等方法
OC的自动内存管理,不同于JAVA垃圾回收。而是在预处理时,直接在应该保留的地方,添加retain,在应该释放的地方,添加release。是直接添加代码。
从效率上,ARC优于手动内存管理。
内存管理:就是确保开辟的堆空间被正确的释放。
每个对象都有一个引用计数器(4 字节)
1. 引用计数为零的时候对象就会被销毁(内存被收回),不为0就不会被销毁,除非程序退出
2. 对象刚创建的时候引用计数为 1
/引用计数器的数值怎么计算
1. 创建对象时默认就是1 (alloc, new, copy)
2. 给对象发送一条retain消息 加 1
3. 给对象发送一条release消息 减 1
4. 给对象发送一条retainCount消息 获取计数器的数值
关于对象销毁
销毁的前提: 引用计数器为 0
销毁时做的事情:调用 dealloc 方法
(重写dealloc函数的时候一定要调用[super dealloc])
多个对象使用同一个对象,这个对象的引用计数是由这多个对象来控制的,谁使用谁加一,谁不使用谁减一
OC的内存管理,就是在编写程序时,保证计数器的数值和使用对象指针数相同,保证计数的增加和减少次数相同。ARC的局限:
1.使用ARC,可能因为代码的不规范,导致内存提前释放。
尤其使用AVAudioplayer类的时候,很可能造成提前释放。
2.导入一些第三方库,或者导入旧代码,这些代码不支持ARC。
使用ARC的技巧
1.四个关键字 修饰引用
__strong(强引用) 缺省属性,其修饰的对象指针,指向哪个对象,会对该对象retain,离开哪个对象,会对该对象release。
@property (nonatomic,strong)CrayFish *crayFish;
__weak(弱引用)其修饰的对象指针,指向任何对象都不会retain。这样的指针指向的对象随时可能消失。如果对象消失了,这个指针会自动变成nil。
@property (nonatomic,weak)CrayFish *crayFish;
//__unsafe_unretained 其修饰的对象指针,指向任何对象都不retain。当指向的对象消失,该指针不会变成nil,仍然指向已经释放的对象
//__autoreleasing 只用来修饰需要被传入地址的指针。如:
//__autoreleasing NSError * error; &error;
2.属性的()参数,原则上,不能写retain copy了,只能写Strong,如果不想retain,写Weak