苹果推荐使用场景:

   如果你编写的程序不是基于 UI 框架的,比如说命令行工具;

如果你编写的循环中创建了大量的临时对象;(常用)

如果你创建了一个辅助线程。

@interface ViewController ()
@property(strong, nonatomic) NSMutableArray *memoryUsageList;
@end @implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad]; //Init
_memoryUsageList1 = [NSMutableArray new]; //创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("test.autoreleasepool", DISPATCH_QUEUE_SERIAL); __block NSString *strTest;
dispatch_sync(serialQueue, ^{
for (int i = ; i < kIterationCount; i++) {
@autoreleasepool {
NSNumber *num = [NSNumber numberWithInt:i]; //
NSString *str = [NSString stringWithFormat:@"%d ", i]; // 2
//Use num and str...whatever...
strTest = [NSString stringWithFormat:@"%@%@", num, str]; //
if (i % kStep == ) {
[_memoryUsageList1 addObject:@(getMemoryUsage())]; // getM方法是获取内存的函数
NSLog(@"000----%f", getMemoryUsage());
}
}
}
});
} //
double getMemoryUsage(void) {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size); double memoryUsageInMB = kerr == KERN_SUCCESS ? (info.resident_size / 1024.0 / 1024.0) : 0.0; return memoryUsageInMB;
}

1,2行每次循环结束,会被系统自动释放。 主要看3行,释放时机应该是viewDidLoad函数结束释放,也就是第4行结束,strTest指向的堆内存空间也会释放。

每次for循环[NSString stringWithFormat:@"%@%@", num, str]都会在堆区开辟一份新的内存空间,strTest重新指向这个空间。之前不加释放池,以为这块内存空间在循环一次后会被自动释放,其实是系统在每一次runloop的同时自动加上释放池,在系统一次runloop结束的时候给池中对象发送release消息释放对象。这里手动添加池子的意义在于,每次for循环结束的时候,自动释放池都会释放[NSString stringWithFormat:@"%@%@", num, str]创建的内存空间,相当于@autoreleasepool给堆中内存添加了一个作用域,主要用于防止瞬时内存过大导致的闪退。也就是以上第二点的常用场景。

摘自

关于@autoreleasepool的更多相关文章

  1. @autoreleasepool在MRC和ARC中的区别

    对于@autoreleasepool {} (1)在ARC中会销毁所有在里面创建的对象,即使你用外面的Strong指针指向他 (2)在MRC中如果有外部的强指针指向,不会销毁对象,retainCoun ...

  2. autoreleasepool自动释放池

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

  3. AutoReleasePool 和 ARC 以及Garbage Collection

    AutoReleasePool autoreleasepool并不是总是被auto 创建,然后自动维护应用创建的对象. 自动创建的情况如下: 1. 使用NSThread的detachNewThread ...

  4. 深入剖析AutoreleasePool

    [深入剖析AutoreleasePool] Objc的AutoreleasePool是一个首尾相连的内存链接,每块大小为1页(32位机上为4kb). 上面可以看到,parent指向父Pool,chil ...

  5. Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

    先看下面一个例子 #import <UIKit/UIKit.h> #import "AppDelegate.h" @interface Something : NSOb ...

  6. iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  7. autoreleasepool的笔记

    1.autoreleasepool总是会被问到,放在自动释放池中的对象合适被释放?理解不正确的答案:{}出了大括号.出了作用域等等.个人认为参考答案是,1.在不是手动添加的AutoreleasePoo ...

  8. iOS基本内存管理:autorelease和autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  9. cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

    #include <CCRef.h> Ref is used for reference count manangement. If a classinherits from Ref. C ...

  10. Runloop与autoreleasePool联系

    autoreleasePool自动释放池,ARC模式下,苹果会自动进行内存管理,不需要我们手动去管理内存.这对于苹果开发者来说,省去了很多事情,不用再每天为了内存管理浪费掉宝贵的开发时间.大家都知道, ...

随机推荐

  1. #学习笔记#JSP数据交互

    #学习笔记#JSP数据交互 数据库的使用方式:   当用户在第一个页面的查询框输入查询语句点提交的时候我们是用什么样的方式完成这个查询的? 答:我们通过在第一个页面提交表单的形式,真正的数据库查询时在 ...

  2. Xamarin Android 下拉列表

    <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" androi ...

  3. linux下openldap 的安装与配置自己总结版

    ---恢复内容开始--- 前段时间公司需要安装openldap 于是去网上查找相关资料,安装文档倒是不少但是或多或少都有点问题 导致自己一直没有安装上,于是结合英文安装文档磕磕巴巴的 安装少了 于是将 ...

  4. JavaScript常见的代码精简

    1.&& callback && callback() 等价于: if(callback){ callback(); } 表达的意思: 先判断 callback 是不是 ...

  5. 廖雪峰Java6 IO编程-2input和output-7序列化

    1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...

  6. sqlserver 带输出参数的存储过程的创建与执行

    创建 use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery4') drop proce ...

  7. Lepus监控之Oracle配置

    1.安装cx_Oracle a.官网下载客户端组件包 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpmoracle-instantclien ...

  8. mysql修改root用户的登录密码

    修改mysql root用户登录密码的方法有很多,网上可以查找到相关的资料 我通过上网查询以后实验成功的方法是使用下面的sql语句进行修改 UPDATE user SET Password = PAS ...

  9. alertjs Documentation

    原文地址:https://github.com/PaulNieuwelaar/alertjs/wiki/Documentation#alertshow For version 3.0 document ...

  10. 使用Oracle DBLink进行数据库之间对象的访问操作

    Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象,例如我们新建了一个数据database1,我们需要操作 ...