黑马程序员技术交流社区
标题:
autorelease基本使用
[打印本页]
作者:
956251361
时间:
2015-12-31 10:05
标题:
autorelease基本使用
1.什么是autorelease?
学习引入:
Person *p = [[Person alloc]init];
[p release];
[p run];
[p run];
因为前边p已经被释放了,后面再用p调用run方法,就会造成野指针访问.
1.自动释放池及autorelease介绍
自动释放池:
(1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的.
(2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中.
自动释池的创建方式:
@autoreleasepool
{
开始创建自动释放池
}结束就代表销毁自动释放池
autorelease是一种支持引用计数的内存管理方式,他可以暂时的保存某个对象,然后在自动释放池结束的时候对其中的每个对象发送release消息.
注意,这里只是发送一次release消息,如果当时的引用计数还是不为0,则对象依然不会被释放.
2.为什么会有autorelease?
oc内存管理机制中比较重要的一条规律是:谁申请,神释放.
如果一个方法需要返回一个新建的对象,那么该对象该如何释放?
方法内部是不会写release来释放对象的,因为这样会将对象立即释放,而返回一个空对象;调用者也不会主动释放该对象,因为调用者遵循”谁申请,谁释放”的原则.那么这个时候,就发生了内存泄露.
针对这种情况,oc中设计了autorelease,既能保证对象的正确释放,又能返回有效的对象.
使用autorelease的好处
(1)不需要关心对象的释放时间
(2)不需要关心什么时候调用release
3.autorelease的基本用法
(1)会将对象放到一个自动释放池中
(2)当自动释放池被销毁是,会对池子里的对象做一次release
(3)会返回对象本身
(4)调用完autorelease方法后,对对象的计数器不受影响(销毁是影响)
4:autorelease的原理
autorelease实际上是把对release的调用延迟了,对于每一个autorelease,系统知识把该object放入到当前的autorelease pool中,当该pool被释放时,,该pool种的所有object会被调用release方法.
5:autorelease何时释放?
对于autorelease pool本身,会在如下两个条件发生时释放
(1)手动释放autorelease pool
(2)runpool结束后自动释放
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2