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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© homura 中级黑马   /  2014-7-25 15:01  /  1196 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 homura 于 2014-7-25 16:09 编辑

既然都有autorelea为什么还要用release呢?

6 个回复

倒序浏览
release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。autorelease 是在自动释放池被销毁,向池中的对象发送release只能释放自己拥有的对象,
回复 使用道具 举报
蔡爽 发表于 2014-7-25 15:14
release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引 ...

那都有自动的了 为什么还有手动呢 有什么不同吗·
回复 使用道具 举报
homura 发表于 2014-7-25 15:30
那都有自动的了 为什么还有手动呢 有什么不同吗·

原因就是自动的话,它得等到整个释放池运行完之后才能释放对象,时间肯定会比手动的来得慢。要是释放池里的程序代码太多,那么有一些对象没有释放,占据内存,会影响性能的
回复 使用道具 举报
homura 发表于 2014-7-25 15:30
那都有自动的了 为什么还有手动呢 有什么不同吗·


autorelease()并不是毫无代价的,其背后的垃圾池机制同样需要占用内存和CPU资源,每次执autorelease()的过程,实际上对应的是执行成对的retain()和release(),以及一次成对的容器存取,还包括其他的逻辑判断。过多不必要的autorelease()将导致垃圾池臃肿膨胀,在存在大量内存操作的程序中会尤为严重地挤占本来就紧张的系统资源。

此外,autorelease()只有在自动释放池被释放时才会进行一次释放操作,如果对象释放的次数超过了应有的次数,则这个错误在调用autorelease()时并不会被发现,在这种情况下,定位错误就变得十分困难了。

因此,我们建议在开发过程中应该避免滥用autorelease(),只在工厂方法等不得不用的情况下使用,尽量以release()来释放对象引用。
回复 使用道具 举报
噢 明白了!
回复 使用道具 举报
autorelease相当于是延迟的release,而release是引用计数立刻减1。除了楼主上面说的之外,在程序中如果我们遇到了在函数中返回堆空间的指针,这时候就需要用到autorelease。
  1. -(NSString *)func
  2. {
  3.     NSString *string = [[NSString alloc] initWithFormat:@“HelloWorld”];
  4.     return [string autorelease];
  5. }
复制代码

因为在外部调用此方法的时候,外部对象不知道方法内部如何实现,也就是说我们没有从方法的名字中看到有任何申请的堆空间的提示,故因此我们需要在方法里面采用autorelease方法加入释放池中。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马