黑马程序员技术交流社区
标题:
OC中自动释放池的作用
[打印本页]
作者:
小石头16544
时间:
2016-1-24 23:49
标题:
OC中自动释放池的作用
autorelease的使用
自动释放池:是用来自动释放对象的,不需要关心对象释放的时间,不需要关心对象什么时候调用release
自动释放池释放的时间:自动释放池结束
自动释放池原理:当池子结束,会想池子里面的对象发送一条release消息
自动释放池使用:1.创建对象 2.加入自动释放池
两种使用方式:
①Person *p = [Person new];
[p autorelease];
②Person *p1 = [[Person new]autorelease];
注意事项:
1.并不是放到自动释放池中的代码中,就会自动加入到自动释放池的
需要我们调用autorelease方法的
在自动释放池的外部调用autorelease方法,是不会被加入到自动释放池中的
不管这个对象是在自动释放池内部还是外部创建的,只要在这个对象在自动释放池中调用autorelease方法,那么就会被放到自动释放池中
总结:不管是在什么地方创建的对象,都必须在自动释放池中,调用autorelease方法,才会被加入自动释放池中
2.自动释放池的嵌套使用:自动释放池是个栈结构,先进后出(每个自动释放池就当成一个桶,先放到下面的,最后拿出来,有利于理解)
延迟调用release,在自动释放池结束时,让对象调用release
注意:自动释放池可不是直接释放对象,而只是让对象release一次,如果对象的retainCount为2,那么自动释放池只能让retainCount变为1,对象就销毁不了
3.自动释放池中不适合放占用内存比较大的对象
1)这是种延迟释放机制,是直到自动释放池结束才释放的,中间大内存文件一直在占用内存
2)不要把大量循环操作放到同一个@autoreleasepool(自动释放池)之间,这样会造成内存峰值的
4.错误用法:
1)连续调用多次autorelease,释放池结束时会执行两次release
⁃ 注意:一个retainCount为1的对象,如果release两次,程序是会崩溃的
· 2)alloc之后调用了autorelease,之后又调用了release(还是release两次)
5.autorelease的应用场景:
经常用来在类方法中,快速创建一个对象
我们平常定义一个指针,先alloc,再init,最后还要手动释放,太麻烦,索性直接当定义出来的同时,调用一下autorelease方法,当自动释放池结束的时候,自动就release,通常可以用于重写init的时候,直接放在init里
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2