# autorelease基本使用
##1.autorelease基本概念
- autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的`所有对象做一次release操作`
+> 注意,这里只是发送release消息,如果当时的引用计数(reference-counted)依然不为0,则该对象依然不会被释放。
- autorelease方法会返回对象本身
```
Person *p = [Person new];
p = [p autorelease];
```
- 调用完autorelease方法后,对象的计数器不变
```
Person *p = [Person new];
p = [p autorelease];
NSLog(@"count = %lu", [pretainCount]); // 1
```
- autorelease的好处
+不用再关心对象释放的时间
+不用再关心什么时候调用release
- autorelease的原理
+autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该 Object放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
---
##2.自动释放池
- 创建自动释放池格式:
- iOS 5.0前
```
NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init]; // 创建自动释放池
[pool release]; // [pool drain]; 销毁自动释放池
```
- iOS 5.0 开始
```
@autoreleasepool
{ //开始代表创建自动释放池
} //结束代表销毁自动释放池
```
- 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
- 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
---
##3.autorelease基本使用
```
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePoolalloc] init];
Person *p = [[[Person alloc] init]autorelease];
[autoreleasePool drain];
```
@autoreleasepool
{ // 创建一个自动释放池
Person *p = [[Person new] autorelease];
} // 销毁自动释放池(会给池子中所有对象发送一条release消息)
```
# ARC基本概念
##1.什么是ARC
- Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
+>手动管理内存, 可以简称MRC (Manual Reference Counting)
- 在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写`retain,release和autorelease`三个关键字就好~这是ARC的基本原则。
- 当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为程序猿,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
---
##2.ARC的注意点和优点
- ARC的注意点
+ARC是编译器特性,而不是运行时特性
+ARC不是其它语言中的垃圾回收, 有着本质区别
- ARC的优点
+完全消除了手动管理内存的烦琐, 让程序猿更加专注于app的业务
+基本上能够避免内存泄露
+有时还能更加快速,因为编译器还可以执行某些优化
---
##3.ARC的判断原则
- ARC的判断原则
+只要还有一个强指针变量指向对象,对象就会保持在内存中
- 强指针
+默认所有指针变量都是强指针
+被__strong修饰的指针
```
Person *p1 = [[Person alloc] init];
__strong Person *p2 = [[Person alloc] init];
```
- 弱指针
+被__weak修饰的指针
```
__weak Person *p = [[Person alloc] init];
```
- > 注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。
---
# ARC快速入门
##1.ARC机制判断
- OS5以后,创建项目默认的都是ARC
![](http://7xj0kx.com1.z0.glb.clouddn.com/Snip20150625_2.png)
- ARC机制下有几个明显的标志:
+ 不允许调用对象的 release方法
+ 不允许调用 autorelease方法
+ 再重写父类的dealloc方法时,不能再调用 [superdealloc];
---
##2.ARC快速使用
```
int main(int argc, const char * argv[]) {
// 不用写release, main函数执行完毕后p会被自动释放
Person *p = [[Pe