iOS 学习@autoreleasepool{}
" 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{}的更多相关文章
- iOS学习笔记之Category
iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- 【IOS学习基础】NSObject.h学习
一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习-压缩图片(改变图片的宽高)
压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
随机推荐
- java.lang.NoClassDefFoundError: org/junit/rules/TestRule
错误原因:通过定位发现是找不到TestRule这个类,检查项目引用的Junit版本为4.7,发现TestRule是在Junit版本4.10后添加的新特性 解决方法:把junit版本由4.7改成4.10
- 图谱论(Spectral Graph Theory)基础
拉普拉斯矩阵(Laplacian matrix),也称为导纳矩阵(Admittance matrix)或者基尔霍夫矩阵(Kirchohoff matrix) 归一化的拉普拉斯矩阵定义为 例子: 拉普拉 ...
- 【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9 ...
- ChemDraw破解版真的不大好用
一直以来都有很多的用户朋友在网上找ChemDraw破解版使用,但是现在厂商清理的厉害,还有国家对知识产权的保护越来越严格,破解版ChemDraw越来越难找了.大家与其花那么多的时候找破解版的,不如买个 ...
- UIWebView加载ANSI格式的txt文件出现乱码问题解决
//若为txt文档 if([encodedString hasSuffix:@".txt"]){ NSData* Data = ...
- PHP+MySQL:测试连接+基本DB操作
PHP使用MySQL,从连接.创建.到结果显示 <?php //连接MySQL测试 $db = mysql_connect("localhost","root&qu ...
- Partial Sum
Partial Sum Accepted : 80 Submit : 353 Time Limit : 3000 MS Memory Limit : 65536 KB Partial Sum ...
- 单片机c语言教程:C51循环语句
单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...
- TFS二次开发-基线文件管理器(4)-标签的创建
上一节已经完成了源码文件的读取,如果要将已经选择的文件保存为一个标签(Lable).在VS我们只能对一个目录做标签,非常的不方便.如果用下面的方法,将选择的文件路径保存为一个List在打标签,就非常的 ...
- 好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
Git commits历史是如何做到如此清爽的? - 知乎 https://www.zhihu.com/question/61283395/answer/186122300 尤雨溪 前端开发.Java ...