、autorelease使用注意

)并不是放到自动释放池中,都会自动加入到自动释放池

1.1) 因为没有调用autorelease方法,所以对象没有加入到自动释放池.

int main(){
@autoreleasepool{
Student *s = [[Student alloc] init];
[s release]; // 正常释放
}
return ;
} 1.2)在自动释放池的外部发送autorelease不会被加入到自动释放池中。 int main(){
@autoreleasepool{ }
// 发送autorelease消息的对象,放到制动释放池外部
// 此时无法被自动释放
Student *s = [[[Student alloc] init] autorelease];
return ;
} 1.3)不管对象是在自动释放池里创建,还是自动释放池外创建,只要在自动释放池内写1个[s autorelease];s就会被放到自动释放池中,注意:autorelease是一个方法,且只有在自动释放池中使用才有效。
int main(){
// 不管在自动释放池内部还是外部创建
Student *s = [[Student alloc] init];
@autoreleasepool{
[s autorelease]; // 此时s加入到释放池
}
return ;
} )自动释放池的嵌套使用
自动释放池是栈结构。
栈:先进后出。后进先出,

int main(int argc, const char * argv[]) {
@autoreleasepool {
// 第一个池子,里面创建no的1学生
Student *s = [[[Student alloc] init] autorelease];
s.no = ;
@autoreleasepool {
// 第二个池子,里面创建no2的学生
Student *s2 = [[[Student alloc] init] autorelease];
s2.no = ;
@autoreleasepool {
// 第二个池子,里面创建no3的学生
Student *s3 = [[[Student alloc] init] autorelease];
s3.no = ;
}
}
}
return ;
}
释放顺序:s3,s2,s1
)自动释放池中不适合放占用内存空间较大的对象
> 尽量避免对大内存使用该方法,对于这种延迟释放机制,尽量少用
> 不要把大量循环操作放到同1个自动释放池中,这样会造成内存峰值的上升。 、autorelease错误用法
、连续调用多次autorelease。
@autoreleasepool {
Student *s = [[[Student alloc] autorelease] autorelease];// 调用了两次autorelease,对象过度释放。
} 、对象创建在释放池外,但是在释放池内进行autorelease后,在释放池外,又进行了release。
int main(int argc, const char * argv[]) {
Student *s = [[Student alloc] init];
@autoreleasepool {
[s autorelease];// 此时出池子后,对象可以被释放
}
[s release];// 对象被释放后再次调用释放,会出错。
return ;
} 、alloc之后调用了autorelease,之后又调用release。
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *s = [[[Student alloc] init] autorelease];
[s release];
}
return ;
} 、alloc之后调用release。 int main(int argc, const char * argv[]) { @autoreleasepool {
// 因为release没有返回值,所以这样调用是错误的。
Student *s = [[[Student alloc] init] release];
} return ;
}

最新文章

  1. WebMethod在webservice里面非静态方法能调用,在页面类里面,静态方法才能调用
  2. Linux 网络编程详解七(并发僵尸进程处理)
  3. Hadoop设置环境变量注意事项
  4. ORacle初级题
  5. Android笔记——什么是json?json如何使用?
  6. LIST动态表格画线(动态列)
  7. 第一百九十七-第二百天 how can I 坚持
  8. 《Apache服务用户身份验证管理》RHEL6.3
  9. 菱形实现气泡Bubble,菱形画箭头,菱形画三角形
  10. ntpath join(path, *paths) 发生UnicodeDecodeError的Bug的解决方案
  11. struts2 日期标签
  12. nginx-push-stream模块源码学习(三)——发布
  13. (转)Python 日期和时间
  14. Django中模板的用法简介
  15. HTML5-svg圆形饼状图进度条实现原理
  16. hdu1005 Number Sequence---找循环节
  17. 利用mybatis-generator自动生成数据持久化的代码
  18. eclipse 工作区空格和回车键显示为乱码
  19. 集腋成裘-06-angularJS -angular_02
  20. git报ssh variant 'simple' does not support setting port解决办法

热门文章

  1. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
  2. 【C traps and pit falls】阅读笔记
  3. cocos2d-js屏幕任何位置点击开始的实现
  4. js运动 淡入淡出
  5. 让git忽略ignore所有文件,只对某些文件进行版本控制
  6. 第二百二十五 how can I 坚持
  7. Codeforces Round #367 (Div. 2) C. Hard problem(DP)
  8. apache配置虚拟主机后,启动速度慢
  9. E3-1230和E3-1230 V2有多神?
  10. SOA和Web Service介绍