OC语言之autorelease基本使用

本文详细介绍了Objective-C中的autorelease机制及其原理,包括autorelease的基本概念、自动释放池的创建与使用,以及在ARC环境下如何处理autorelease。文中通过实例代码展示了autorelease的工作流程,并对比了手动内存管理和ARC的优缺点。同时,提到了在使用autorelease时的注意事项,如避免过度释放和正确使用自动释放池。
摘要由CSDN通过智能技术生成

# 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值