回顾自动释放池的使用及个人理解autorelease

---为什么会有autorelease?

OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放

考虑这种情况,如果一个方法需要返回一个新建的对象,该对象何时释放?

方法内部是不会写release来释放对象的,因为这样做会将对象立即释放而返回一个空对象;调用者也不会主动释放该对象的,因为调用者遵循“谁申请,谁释放”的原则。那么这个时候,就发生了内存泄露。

---不使用autorelease存在的问题

针对这种情况,Objective-C的设计了autorelease,既能确保对象能正确释放,又能返回有效的对象。

---使用autorelease的好处

(1)不需要再关心对象释放的时间

(2)不需要再关心什么时候调用release

---autorelease用法

(1)会将对象放到一个自动释放池中

(2)当自动释放池被销毁时,会对池子里的所有对象做一次release

(3)会返回对象本身

(4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)


---autorelease原理:

 //把对release的调用延迟,系统只是把该 Object放入了当 前的Autorelease pool,当该pool被释放时,

// 该pool中的所有Object会被调用Release


---autorelease何时释放?

对于autoreleasepool本身,会在如下两个条件发生时候被释放 

1)手动释放Autorelease pool

2)Runloop结束后自动释放

//对于autoreleasepool内部的对象在引用计数的retainCount== 0的时候释放。release和autorelease pool 的 drain都会触发 retain--事件。

------>autorelease 只是一个标记,表明会延迟释放 当一个autorelease对象超出自己的作用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面所有的对象发送一次release方法,释放pool中所有的对象。


自动释放池栈

(1)iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。

(2)当一个对象调用autorelease方法时,会将这个对象放到位于栈顶的释放池中



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值