AutoReleasePool 和 ARC 以及Garbage Collection
AutoReleasePool
autoreleasepool并不是总是被auto 创建,然后自动维护应用创建的对象。
自动创建的情况如下:
1. 使用NSThread的detachNewThreadSelector:toTarget:withObject:方法创建新线程时,新线程自动带有autoreleasepool。
2. Main thread of Cocoa Application
以下情况需要开发者创建:
1. 在使用Dispatch Queue时, 虽然其Pool中每个thread都会有autoreleasepool,但是如果我们给的task每个都创建一些对象,并做autorelease,那若提交的task太多,比如有100000个,那在thread退出前,这些内存都无法释放,等于说有大量内存被占用而释放不了,也类似于leak了,所以这时,最好每个提交的task都有自己的autoreleasepool,task完成了,对象也释放了,下次再用,再分配,再释放。
2. 跟1类似的,如果没有函数内部有loop,并且每个loop都创建很多对象,如果希望这些对象早点释放,就可以自己创建autoreleasepool
分析一下现有API的行为。
NSString的方法:stringWithCString:encoding:,它创建了一个NSString对象返回了,但是它的方法名中没有Create和Copy,意味着调用者并不是这个新建对象的owner。那这个新建对象怎么release呢?autoreleasepool必是其神秘之处,下面一点点说说它。stringWithCString:encoding:这个方法内部没有autoreleasepool,但假设外部的某个方法是在autoreleasepool中的,这个新建对象会在外部的autoreleasepool退出时被释放。而Foundation/Cocoa很多方法都是这样的,就是因为它整体上依赖一个autoreleasepool的嵌套。
#import <Foundation/Foundation.h>
#include <pthread.h> void dosth(void *p)
{
{
int it = ;
while ( it < )
{
[NSString stringWithCString:"ajeiauwirejafs" encoding:NSUTF8StringEncoding];
it++;
}
}
} void * dosth2(void *p)
{
{
int it = ;
while ( it < )
{
[NSString stringWithCString:"ajeiauwirejafs" encoding:NSUTF8StringEncoding];
it++;
}
}
return NULL;
}
int main(int argc, const char * argv[])
{ @autoreleasepool { for (int i = ; i<; i++) {
[NSThread detachNewThreadSelector:@selector(dosth) toTarget:NULL withObject:NULL];
pthread_t pid;
pthread_create(&pid, NULL, dosth2,NULL);
sleep();
}
// insert code here...
NSLog(@"Hello, World!"); } return ;
}
ARC(Automatic Reference Counting)
AutoReleasePool确实很好用,不过Apple更推荐ARC(Automatic Reference Counting)。本文的重点是能区分AutoReleasePool和ARC,并不详尽介绍ARC。
Automatic Reference Counting (ARC) is a compiler feature that provides automatic memory management of Objective-C objects. ARC works by adding code at compile time to ensure that objects live as long as necessary, but no longer. Conceptually, it follows the same memory management conventions as manual reference counting by adding the appropriate memory management calls for you.
也就是说ARC是由编译器在编译后的代码中假如retain/release的调用,编译器可以让临时对象的生命周期刚刚好,不会过早被release,也不会这个对象不再需要后很久才释放。概念上说,ARC跟手动管理一样的,但是实际上还是有很多差别的,比如:既然编译器会插入Release/Retain代码,那程序中就不允许调用retain,release, autorelease等方法了,不然就会造成内存管理的混乱,但是CFRelease,CFRetain还是可以用的【也就是说,ARC只管ObjectiveC那部分,而管不了C,CoreFoundation那部分】。Wiki上总结了在使用ARC时,有哪些API不可以调用,哪些又必须用。
其中一项是:
“There is no casual casting between id and void *.
You must use special casts that tell the compiler about object lifetime. You need to do this to cast between Objective-C objects and Core Foundation types that you pass as function arguments”
也就是说在将OBJC object和CoreFoundation的对象之间Cast时,必须用特殊的cast操作符进行。
__bridgetransfers a pointer between Objective-C and Core Foundation with no transfer of ownership.__bridge_retainedorCFBridgingRetaincasts an Objective-C pointer to a Core Foundation pointer and also transfers ownership to you.You are responsible for calling
CFReleaseor a related function to relinquish ownership of the object.__bridge_transferorCFBridgingReleasemoves a non-Objective-C pointer to Objective-C and also transfers ownership to ARC.ARC is responsible for relinquishing ownership of the object.
上面说ARC只管ObjC的对象,不管C/CF的对象,如果一个对象在CF中创建,要拿到ObjC中使用,如果希望ARC接管这个对象,那就使用__bridge_transfer or CFBridgingRelease,如果不希望由ARC接管,那就用__bridge。如果一个对象在ObjC中创建,要拿到CF中使用,并由CF/C释放,那就得使用__bridge_retained or CFBridgingRetain,如果还继续由ARC管理,就使用__bridge.
其他的关于ARC的使用限制,就在要使用时一一查看吧,本文对ARC讲到这里,应该已经很清楚ARC跟autoreleasepool的关系了。
Garbage Collection
ObjC 2.0 provided an optional conservative, generational garbage collector. 如果enable了garbage collection,那么runtime会将retain/release转成空操作,所有的ObjC对象都可以被回收,而C的对象可以用__strong标记符让GC回收;A zero-ing weak subsystem was also provided such that pointers marked as "__weak" are set to zero when the object (or more simply, GC memory) is collected.但是GC在iOS上performance不好,从来都没有enable过,而且在OS X 10.8上也会设置为deprecated,将来会从OSX中移除。
Reference:
ARC:https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226
ARC:http://clang.llvm.org/docs/AutomaticReferenceCounting.html
ARC: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
AutoReleasePool 和 ARC 以及Garbage Collection的更多相关文章
- Python Garbage Collection 与 Objective-C ARC
转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363 Python GC 与 Objective-C ARC 提起GC(Ga ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- How Garbage Collection Really Works
Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...
- Java Garbage Collection Basics--转载
原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...
- [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)
source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...
- The Impact of Garbage Collection on Application Performance
As we’ve seen, the performance of the garbage collector is not determined by the number of dead obje ...
- [Java] 垃圾回收 ( Garbage Collection ) 的步骤演示
关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介 上一篇博客,介绍了堆的内存被分为三个部分:年轻代.老年代.永生代.这篇博文将演 ...
- [Java] 垃圾回收机制 ( Garbage Collection ) 简介
自动垃圾回收( Automatic Garbage Collection ) 自动垃圾回收,是指在堆(Heap)内存上分辨哪些对象还在被使用,哪些对象没有被使用,并清除没有被使用的对象.所以,这里的垃 ...
- 【python进阶】Garbage collection垃圾回收1
前言 GC垃圾回收在python中是很重要的一部分,同样我将分两次去讲解Garbage collection垃圾回收,此篇为Garbage collection垃圾回收第一篇,下面开始今天的说明~~~ ...
随机推荐
- phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序
phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序 用命名空间区分不同的数据库实例,对应代码结构上是不同的目录区分,在同一目录下基类负责初始化连接.连接来自初始化时注入的多个db服务 隐 ...
- GATK原理及流程
用GATK跑了很久的流程,但还是不知道它的原理,现在项目要深入,没有流程可用,一切都要手动,所以必须开始着手了解GATK运行的原理,必须要知道需要输入什么,基本的算法,输出是什么. 参见: GATK使 ...
- 利用Github和Hexo搭建独立的个人博客--基础篇
利用Github和Hexo搭建独立的个人博客--基础篇 摘要:本文主要参考了使用hexo和Github上创建自己的博客.如何搭建一个独立博客--简明Github Pages与Hexo教程和使用GitH ...
- worker中加载本地文件报错的解决方案
如果在一个swf的主线程中加载文件时,报安全沙箱的错误, 网上有诸多的解决方案.但是如果在一个worker中加载本地文件报类似如下的错误: *** 安全沙箱冲突 *** SecurityError: ...
- HTML5中的文本级语义
<p>这篇文章的发布时间是<time datetime="2016-02-26T16:30+08:00" pubdate>今天</time>&l ...
- jq三级全选全不选
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 从Oracle迁移到Mysql之前必须知道的50件事
1. 对子查询的优化表现不佳. 2. 对复杂查询的处理较弱 3. 查询优化器不够成熟 4. 性能优化工具与度量信息不足 5. 审计功能相对较弱 6. 安全功能不成熟,甚至可以说很粗糙.没有用户组与角色 ...
- DSP bootloader学习笔记1
DSP bootloader学习笔记1 彭会锋 参考: TMS320F28xx DSP中内部Flash的应用研究 http://wenku.baidu.com/view/83e9837931b765c ...
- arcgis API for javascript 学习笔记
ArcGis Server地图是缓存的,意味着它有服务器管理员简历提示性能的一组预先渲染的切片.由于这个原因地图通过ArcGISTiledMapServiceLayer表示 如果地图服务没有一个可用的 ...
- 如何在Objective-C中实现链式语法
在接触到开源项目 Masonry 后,里面的布局约束的链式写法让我颇感兴趣,就像下面这样: 1 2 3 4 5 6 7 8 UIEdgeInsets padding = UIEdgeInsetsMak ...