OC 内存管理的黄金法则

内存管理的法则

1.凡是用allocretainnew(或使用new开头的方法)copy(或使用copy开头的方法)mutableCopy(或使用mutableCopy开头的方法)【创建】的对象,都必须使用releaseautorelease方法【释放】

Δ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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值