苹果推荐使用场景:

   如果你编写的程序不是基于 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. hdu5000 Clone dp+大数

    After eating food from Chernobyl, DRD got a super power: he could clone himself right now! He used t ...

  2. EBS打补丁参考

    EBS Application打补丁参考:http://blog.csdn.net/cunxiyuan108/article/details/6009784 整体步骤: 0. 停止应用(注意确认FND ...

  3. 嵌入式Linux内核tasklet机制(附实测代码)

    Linux 中断编程分为中断顶半部,中断底半部 中断顶半部: 做紧急,耗时短的事情,同时还启动中断底半部. 中断底半部: 做耗时的事件,这个事件在执行过程可以被中断. 中断底半部实现方法: taskl ...

  4. nginx 文档链接

    https://www.cnblogs.com/wcwnina/p/8728391.html    NGINX简介 http://www.nginx.cn/doc/                  ...

  5. 【python】numpy中的shape用法

    转自 https://blog.csdn.net/u010758410/article/details/71554224# shape函数是numpy.core.fromnumeric中的函数,它的功 ...

  6. oracle批量删除某个用户下的所有表

    打开sql developer,输入如下语句,把USERNAME替换为需要删除的的用户名 然后把查询出来的结果复制出来执行一遍就行了. SELECT 'DROP table '||table_name ...

  7. centos7-软件安装-jdk1.8

    JDK1.8下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装目录 ...

  8. HOOK - 低级鼠标Hook

    参考博客 一.SetWindowsHookEx HHOOK WINAPI SetWindowsHookEx( __in int idHook, \\钩子类型 __in HOOKPROC lpfn, \ ...

  9. 成为JavaGC专家—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢? 首先可以满足作为一名软件工程师的求知欲, 其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信 ...

  10. android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法

    1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...