" 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. Step By Step(Lua调用C函数)

    原文: http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html Lua可以调用C函数的能力将极大的提高Lua的可扩展性 ...

  2. Json介绍以及解析Json

    首先,介绍一下Json字串,以下Json的介绍引用网上资料. 简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应 ...

  3. gcc使用备忘

    本文为原创文章,转载请指明该文链接 Options Controling the kind of Output -x language 明确说明输入文件的编码语言,没有该选项的话, gcc 会根据输入 ...

  4. ORA-00349: failure obtaining block size for &#39;+fra_grp01_d

    有一次恢复库以后,open时报错ORA-00349,例如以下.最后通过删除这个log group解决.   SQL> alter database open resetlogs; alter d ...

  5. 谈谈 epmd

    在<Erlang/OTP 并发编程实战>中,对 epmd 有如下描述: epmd  代表 Erlang 端口映射守护进程(Erlang Port Mapper Daemon). 每启动一个 ...

  6. jquery中end()方法的解释

    来源:http://www.jquery001.com/jquery-end-method.html 对于end()方法,jQuery文档是这样解释的:jQuery回到最近的一个"破坏性&q ...

  7. Android系统中Parcelable和Serializable的区别,自动化实现Parcelable接口的插件

    Parcelable和Serializable的区别 参考地址:http://greenrobot.me/devpost/android-parcelable-serializable/ 由于最终的区 ...

  8. Android Studio中debug和release模式默认的参数配置

    The possible properties and their default values are: debuggable:表示是否可以在手机上调试程序. 在Eclipse中,只有android ...

  9. lua(仿单继承)

    --lua仿单继承 Account = { balance = } function Account:new(o) o = o or {} setmetatable(o, self)--Account ...

  10. (四)DIH导入结构化数据

    (四)DIH导入结构化数据 目前大多数的应用程序将数据存储在关系数据库(如oracle.sql server .mysql等).xml文件中.对这样的数据进行搜索是很常见的应用.所谓的DataImpo ...