Autorelease自动释放池的使用

  • 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain、release和autorelease.
  • MRC内存管理原则:谁申请,谁释放 遇到alloc/copy/retain 都需要添加release或autorelease
  • autorelease 只是一个标记,表明会延迟释放 当一个autorelease对象超出自己的作用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面所有的对象发送一次release方法,释放pool中所有的对象。

自动释放池autorelease pool的释放与消息循环有关

  • 模拟一个简单的消息循环
void click(int type){
printf("你执行的操作%d \n",type);
} int main(int argc, const char * argv[]) {
@autoreleasepool {
while (YES) {
printf("请输入要执行的操作,0结束:"); int n;
scanf("%d",&n); //接收用户的输入 等待 阻塞程序的运行
if (n == 0) {
printf("程序结束\n");
break;
}else{
click(n);
continue;
}
}
}
return 0;
}
  • 消息循环的执行过程

应用程序开启->事件发生(例如点击)->转换成一个事件对象->开启autorelease pool->执行我们的处理代码,代码中生成的临时变量都可以放在pool中->pool销毁->下一次循环

  • 主线程的消息循环

主线程内默认有一个开启的消息循环,在事件开启的时候创建自动释放池,在事件结束的时候倾倒释放池

自动释放池的使用场景

  • 在循环中创建大量的临时变量
  • 在子线程中
  • 下面为循环中自动释放池使用 :
for (int i = 0; i < largeNumber; ++i) {
@autoreleasepool{
NSString *str = @"Hello World";
str = [str stringByAppendingFormat:@" - %d", i];
str = [str uppercaseString];
NSLog(@"%@", str);
}
}

在循环中创建了大量的临时对象NSString,在方法没有走完的情况下,每次创建的对象是不会释放的,所以我们用自动释放池,在每次循环开始的时候把临时变量NSString放到池里,等每次循环结束的时候倾倒池子,从而每次释放释放NSString临时变量。

Autorelease自动释放池的使用的更多相关文章

  1. OC学习篇之---数组对象的引用计数问题和自动释放池的概念

    之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/de ...

  2. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  3. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

  4. autoreleasepool自动释放池

     示例: @autoreleasepool { ; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替) Person *per = [[Person alloc ...

  5. OC之property和自动释放池

    property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...

  6. OC11_自动释放池

    // // Dog.h // OC11_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  7. Objective c 自动释放池

    学IOS 的大家都知道,IOS 一共有三种内存管理方式:MRC .ARC.自动释放池.我按照我个人的理解简述一下自动释放池,希望能给大家一点帮助,如有错误请大家及时批评指正. 自动释放池有几个特点:1 ...

  8. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  9. 04-OC属性的使用、自动释放池、封装和继承

    目录: 一.IOS6声明式属性的使用 二.autoreleasepool自动释放池 三.封装.继承 回到顶部 一.IOS6声明式属性的使用 注:声明式属性默认情况下,并没有解决内存问题, 当使用@pr ...

随机推荐

  1. 低功耗蓝牙BLE之连接事件、连接参数和更新方法

    转自:http://blog.csdn.net/zzfenglin/article/details/51304084 连接事件 在一个连接当中,主设备会在每个连接事件里向从设备发送数据包.一个连接事件 ...

  2. Django配置和初探

    Django是python下的一款网络服务器框架. 1.安装 windos:    pip install django linux:    sudo pip install django 2.启动 ...

  3. Python 迭代器 & __iter__方法

    转载来自: http://blog.csdn.net/bluebird_237/article/details/38894617 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现 ...

  4. sql表和字段的别名

    1. sql表和字段的别名通过关键字 AS 来指定. 2.通常,定义字段别名的 AS 关键字可以省略,但我们建议不要省略 AS 关键字.别名(alias)是 SQL 的标准语法,几乎所有的数据库系统都 ...

  5. 单色半透明-兼容IE7

    background: #000; width: 100%;height: 100%; filter: alpha(opacity=30); opacity: 0.3;

  6. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  7. 朋友圈常见单页面触屏滑动上下翻屏功能jQuery实现

    翻页插件:实现原理,用margin-top来控制页面容器位置来实现上下翻页.margin这属性很好用,可以用来制作侧栏动画滑出菜单(左菜单,右内容,控制两者的margin实现):或者head下滑菜单 ...

  8. Linux Mysql 忘记用户密码

    1.停止mysql 服务 /etc/init.d/mysqld stop 2.启动mysql服务跳过授权表并在后台运行  /etc/init.d/mysqld  start  -u root --sk ...

  9. 前端性能监控方案window.performance 调研(转)

    1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...

  10. Django分析之使用redis缓存服务器

    时间长没有更新了,这段时间一直忙着一个项目,今天就记录一个现在经常会用到的技术吧. redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器, ...