OC-ARC
2015-11-21 10:55
399 查看
一、 基本简介
- ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
- ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
二、基本原理
1. 规则
ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中
2. 强指针和弱指针
- 默认所有实例变量和局部变量都是Strong指针
- 弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误
三、使用注意
- 不能调用release、retain、autorelease、retainCount
- 可以重写dealloc,但是不能调用[super dealloc]
- @property : 想长期拥有某个对象,应该用strong(相当于retain),其他对象用weak(相当于assign)
- 其他基本数据类型依然用assign
- 两端互相引用时,一端用strong、一端用weak
- 错误写法:_weak Person *p = [[Person alloc] init];
/* 1.autorelease的基本用法 1> 会将对象放到一个自动释放池中 2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 3> 会返回对象本身 4> 调用完autorelease方法后,对象的计数器不变 2.autorelease的好处 1> 不用再关心对象释放的时间 2> 不用再关心什么时候调用release 3.autorelease的使用注意 1> 占用内存较大的对象不要随便使用autorelease 2> 占用内存较小的对象使用autorelease,没有太大影响 4.错误写法 1> alloc之后调用了autorelease,又调用release @autoreleasepool { // 1 Person *p = [[[Person alloc] init] autorelease]; // 0 [p release]; } 2> 连续调用多次autorelease @autoreleasepool { Person *p = [[[[Person alloc] init] autorelease] autorelease]; } 5.自动释放池 1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出) 2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池 6.自动释放池的创建方式 1> iOS 5.0前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pool release]; // [pool drain]; 2> iOS 5.0 开始 @autoreleasepool { } */ #import <Foundation/Foundation.h> #import "Person.h" int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *pp = [[[Person alloc] init] autorelease]; [pool release]; // [pool drain]; @autoreleasepool { // 1 Person *p = [[[[Person alloc] init] autorelease] autorelease]; // 0 // [p release]; } return 0; } void test() { @autoreleasepool {// { 开始代表创建了释放池 // autorelease方法会返回对象本身 // 调用完autorelease方法后,对象的计数器不变 // autorelease会将对象放到一个自动释放池中 // 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 Person *p = [[[Person alloc] init] autorelease]; p.age = 10; @autoreleasepool { // 1 Person *p2 = [[[Person alloc] init] autorelease]; p2.age = 10; } Person *p3 = [[[Person alloc] init] autorelease]; } // } 结束代表销毁释放池 }
相关文章推荐
- 在 Linux 命令行下使用 Mop 监视股票价格
- SVN工具使用总结
- Android 欢迎界面及首次安装导航界面实例
- 计算器简单封装
- 根据二叉树的先序和中序来构建二叉树
- 奇异值分解(SVD) --- 几何意义
- android前端定制浏览器开发(干货)
- Android中的线程
- [HDU 2312]Cliff Climbing[BFS]
- 理解Scala的函数式风格:从var到val的转变
- DBA常用脚本和表
- 如何优化JavaScript的构造函数
- 微信环境下完全前后端分离未必是最好的解决方案
- http协议头文件的控制信息(转)
- ACM_lca
- @IntDef的使用
- android开发Enum (枚举)的完美替代 —— @IntDef的使用
- 25.NSUserDefaults储存数据的类(数据持久化)
- Pulltorefresh使用中碰到的问题
- @@identity、scope_identity()、IDENT_CURRENT('tablename')函数的区别