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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tz19900926 中级黑马   /  2015-9-25 21:18  /  986 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tz19900926 于 2015-9-25 21:19 编辑


@autoreleaspool的使用注意,
1、并不是所有放到自动释放池中的代码,产生的对象就会自动释放,如果需要释放,必须加入到自动释放池中
Person *p1 = [[Person new] autorelease];
2如果对象调用了autorelease 但是调用autorelease的时候,没有在任何一个自动释放池中,此时该对象也不会被加入到自动释放池
3、我们只需要在自动释放池代码中调用autorelease就可以把对象自动加入到自动释放池

autorelease嵌套
自动释放池是特殊的栈结构,和内存栈区不一样
对象存在位于栈顶位置的自动释放池中
Person * p = [Person new];
@autoreleasepool{
      @autoreleasepool{
              @autoreleasepool{           
                     [p autorelease];     
                  }
         }
}
autorelease建议不要存放会占很大空间的对象
不要把大量循环操作放在同一个池子里,这样会造成内存峰值上升

2autorelease错误用法
Person *p = [Person new];
@autoreleasepool{
           [p artorelease];  
}
[p release];

屏幕快照 2015-09-25 20.55.23.png (59.23 KB, 下载次数: 2)

屏幕快照 2015-09-25 20.55.23.png

1 个回复

倒序浏览
图中1,2,3是自动释放池,最顶端的池子放对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马