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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

autorelease对象方法的作用:延迟对象释放的时间,调用的返回结果为对象本身
@autoreleasepool{}自动释放池:由系统创建,可嵌套使用,以栈的形式存放,被销毁时,对池中的所有对象做一次release操作
参考以下代码:
  1. <p class="MsoNormal"><span lang="EN-US">#import “Person.h”</span></p>

  2. <p class="MsoNormal"><span lang="EN-US"> </span></p>

  3. <p class="MsoNormal"><span lang="EN-US">int main()</span></p>

  4. <p class="MsoNormal"><span lang="EN-US">{</span></p>

  5. <p class="MsoNormal"><span lang="EN-US">         Person
  6. *p;</span></p>

  7. <p class="MsoNormal"><span lang="EN-US">         @autoreleasepool{</span></p>

  8. <p class="MsoNormal"><span lang="EN-US">                   p
  9. = [[[Person alloc] init] autorelease]; // autorelease</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
  10. mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
  11. Calibri;mso-hansi-theme-font:minor-latin">方法延迟</span><span lang="EN-US">release</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
  12. mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
  13. Calibri;mso-hansi-theme-font:minor-latin">操作至自动释放池被销毁时,此时对象计数器值不发生改变</span></p>

  14. <p class="MsoNormal"><span lang="EN-US">                   p.age
  15. = 10;</span></p>

  16. <p class="MsoNormal" style="text-indent:21.0pt"><span lang="EN-US">} // </span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
  17. mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
  18. Calibri;mso-hansi-theme-font:minor-latin">自动释放池在此行被销毁,此时对池中的所有对象做一次</span><span lang="EN-US">release</span><span style="font-family:宋体;mso-ascii-font-family:
  19. Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
  20. minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">操作,此时对象计数器的值才真正</span><span lang="EN-US">-1</span></p>

  21. <p class="MsoNormal"><span lang="EN-US"> </span></p>

  22. <p class="MsoNormal"><span lang="EN-US">         return
  23. 0;</span></p>

  24. <p class="MsoNormal"><span lang="EN-US">}</span></p>
复制代码

autorelease的用法:
* 将对象放入自动释放池中
* 当自动释放池被销毁时,对池中的所有对象做一次release操作
* 返回对象本身
* 调用autorelease方法后,对象的引用计数器不会发生变化,因为release并没有马上执行,而是延迟到了自动释放池被销毁时
autorelease的好处:
* 无需精确控制release的调用时间
autorelease的注意点:
* 尽量手动使用release方法管理内存
* 占用内存较大的复杂对象,建议手动管理,不要随便使用autorelease方法
* 占用内存较小的对象,autorelease方法对内存影响不大,为了性能,尽量手动调用release进行内存管理
* 使用autorelease时,还是要遵循一个alloc对应一个release/autorelease的内存管理原则,否则可能出现野指针错误

2 个回复

倒序浏览
  1. #import “Person.h”

  2. int main()
  3. {
  4.         Person *p;
  5.         @autoreleasepool{
  6.                 p = [[[Person alloc] init] autorelease]; // autorelease方法延迟release操作至自动释放池被销毁时,此时对象计数器值不发生改变
  7.                 p.age = 10;
  8. } // 自动释放池在此行被销毁,此时对池中的所有对象做一次release操作,此时对象计数器的值才真正-1

  9.         return 0;
  10. }
复制代码
回复 使用道具 举报
咱俩复习进度差不多啊   感觉入学考试难。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马