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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小石头16544 中级黑马   /  2016-1-24 23:49  /  2092 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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里

0 个回复

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