" ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有alloc,new,[mutable]copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. "网摘

自从ARC以后 我们不需要手动释放内存 但是有时候 我们仍然需要手动释放,以便更加精准的管理内存问题.

这里 就用到@autoreleasepool{} //自动释放内存池 “释放池”

(1)@autoreleasepool{}  按栈的顺序释放内存 销毁对象,  可以嵌套使用

(2)@autoreleasepool{}  相当于 做 autorelease / release 操作,如果把已经autorelease / release 的对象做 释放池操作 就会报野指针错误. (ARC 好像这个问题就很少有了吧…)

举例子

(1)循环创建临时变量 或者说 短时间内创建大量变量  应该考虑使用 @autoreleasepool{}

这个例子 真是不胜枚举啊

- (void)viewDidLoad {
[super viewDidLoad];
[self test2];
} - (void)test2
{
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < ; ++i) {
@autoreleasepool {
MethodDetailMusic *music = [[MethodDetailMusic alloc]init];
music.title = @"haha";
// NSLog(@"%@", music.title);
}
}
NSLog(@"end - %f", CFAbsoluteTimeGetCurrent() - start);
}

(1)是否有 @autoreleasepool {} 拿 Leak工具 跑了一次 看对比截图 

看前面几个惊险的MB  就看出差别了吧

(2)@autoreleasepool {} 放在循环体外 和循环体内还是有很大差别的


//10000  

2016-08-18 11:44:44.558 LearningTheroyDemo[40012:6355283] end - 0.002388

2016-08-18 11:45:49.970 LearningTheroyDemo[40032:6356878] end - 0.002540


//10000000(从这可以看出枚举量越大 效率差别越明显)

2016-08-18 11:47:30.521 LearningTheroyDemo[40071:6359862] end - 2.655450

2016-08-18 11:48:14.521 LearningTheroyDemo[40080:6361041] end - 2.932974

(2) 自己创建的线程 "detach thread", 有相对来说 很多需要释放的对象,应该使用@autoreleasepool{} 否则内存会升高,但是 如果这个非关联线程 "detach thread"没有使用到cocoa的相关调用 就不必创建 autorelease pool.

第二段,大概是说如果创建POSIX 线程 做二级线程 这个就不能使用 cocoa ,不能使用 @autoreleasepool{}, 除非 cocoa

在多线程里面,并且是一级线程里面的对象.所以 在二级POSIX线程里面要使用cocoa必须有这个所谓的一级线程,并且要立即销毁.所以 你要使用 cococa 要确保是在多线程里面 如何判断 bla bla.

我觉得 我翻译的还行  没出什么原则的bug 网上好多帖子 说的 不是不对 就是不准 , 根本没说明白 detach thread 里面 到底 能不能用 @autoreleasepool{} ? 简单的来说 如果 创建了 很多需要释放的对象 就可以用啊 ,因为 我们常用的多线程(NSOperation NSthread  GCD ) 是满足需求没有例外的 ,就是 官方文档提到的这个 "POSIX thread" ( 是调用pthread_create来创建的线程 C语言底层部分的知识了此处不再扩展,需要深究时候及时学习)不能使用@autoreleasepool{},但是也给了一个 处理方案...

If you are making Cocoa calls outside of the Application Kit’s main thread—for example if you create a Foundation-only application or if you detach a thread—you need to create your own autorelease pool.

If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should periodically drain and create autorelease pools (like the Application Kit does on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If, however, your detached thread does not make Cocoa calls, you do not need to create an autorelease pool.

Note

If you are creating secondary threads using the POSIX thread APIs instead of NSThread objects, you cannot use Cocoa, including NSAutoreleasePool, unless Cocoa is in multithreading mode. Cocoa enters multithreading mode only after detaching its first NSThread object. To use Cocoa on secondary POSIX threads, your application must first detach at least one NSThread object, which can immediately exit. You can test whether Cocoa is in multithreading mode with the NSThread class method isMultiThreaded.

参考

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/

http://www.cnblogs.com/CoderAlex/p/5232357.html

iOS 学习@autoreleasepool{}的更多相关文章

  1. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  2. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  3. 【IOS学习基础】NSObject.h学习

    一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...

  4. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  5. iOS学习-压缩图片(改变图片的宽高)

    压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...

  6. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  7. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  8. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  9. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

随机推荐

  1. 推荐vim配置

    "设置编码,处理中文乱码,文件默认utf8编码set fileencodings=utf-8,ucs-bom,cp936,big5 "设置默认配色方案colorscheme def ...

  2. dos2unix dos文本转换为linux文本 /bin/bas^M:bad interpreter

    第一种方法:dos2unix -f 文本名 第二种方法: 首先:vi 文本名 然后::set ff? 如果出现fileforma=dos那么就确定是linux和windows之间的不完全兼容 :set ...

  3. java获取真实的ip地址

    直接上代码,获取请求主机的IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 public class IPUtil { private static final Logger logger = ...

  4. BZOJ 1260 CQOI2007 涂色paint 动态规划

    题目大意:给定一块木板,上面每一个位置有一个颜色,问最少刷几次能达到这个颜色序列 动态规划,能够先去重处理(事实上不是必需),令f[i][j]代表将i開始的j个位置刷成对应颜色序列的最小次数.然后状态 ...

  5. ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错

    今天接口由get换成post,我去改进行登录但出现了这个错误,首先出错先看能不能与服务器交互,能不能获得数据,其次,获得的数据是不是你想要的,记住,首先出错要想到是自己的问题,还有就是程序崩了要学会自 ...

  6. centos7下挂载U盘和移动硬盘

    挂载U盘 1.使用fdisk -l命令查看磁盘情况 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:1000.2 GB, 1000204886016 字节,19535 ...

  7. vue起手式

    主要步骤 安装node 安装npm 安装vue-cli(vue命令行工具) 初始化一个vue项目 进行开发 # 安装node # 安装npm # 安装cnpm,在中国大陆防止被墙 # 安装git # ...

  8. shell编程实战总结

    最近复习一下shell,顺便高级进阶一下,之前写脚本能简单尽量简单来,发现好多高深的东西还是没有理解,因此在这里记录一下整个过程并做相应的总结. 通过上代码的方式来介绍,后续可能会调整相应的排版 1. ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.1——设置项目参数

    问题: 开发的时候经常需要向项目中添加一些额外的参数或者硬编码的值. 解决方案: 使用ext块设置公用的值.如果需要从build文件中移除这些值,可以将参数放到gradle.properties文件中 ...

  10. Android开发:拖拽

    google官网的training和API两个地方都提到了拖拽的实现,两种方法不太一样. 方法一 training(https://developer.android.com/training/ges ...