---为什么会有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方法时,会将这个对象放到位于栈顶的释放池中