A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 956251361 中级黑马   /  2015-12-31 10:05  /  449 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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结束后自动释放

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马