黑马程序员技术交流社区

标题: autorelease和release [打印本页]

作者: homura    时间: 2014-7-25 15:01
标题: autorelease和release
本帖最后由 homura 于 2014-7-25 16:09 编辑

既然都有autorelea为什么还要用release呢?
作者: 蔡爽    时间: 2014-7-25 15:14
release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。autorelease 是在自动释放池被销毁,向池中的对象发送release只能释放自己拥有的对象,
作者: homura    时间: 2014-7-25 15:30
蔡爽 发表于 2014-7-25 15:14
release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引 ...

那都有自动的了 为什么还有手动呢 有什么不同吗·
作者: 道本真    时间: 2014-7-25 15:40
homura 发表于 2014-7-25 15:30
那都有自动的了 为什么还有手动呢 有什么不同吗·

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


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

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

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

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






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2