一、 基本简介

  • 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
{
//
Person *p = [[[[Person alloc] init] autorelease] autorelease]; // 0
// [p release];
}
return ;
} void test()
{
@autoreleasepool
{// { 开始代表创建了释放池 // autorelease方法会返回对象本身
// 调用完autorelease方法后,对象的计数器不变
// autorelease会将对象放到一个自动释放池中
// 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p = [[[Person alloc] init] autorelease]; p.age = ; @autoreleasepool
{
//
Person *p2 = [[[Person alloc] init] autorelease];
p2.age = ; } Person *p3 = [[[Person alloc] init] autorelease]; } // } 结束代表销毁释放池
}

最新文章

  1. 谈c++ pb_ds库(一)rope大法好
  2. ExecutorService中submit()和execute()的区别
  3. h5直播开发之旅总结
  4. 如何用 fiddler 调试线上代码
  5. Java动态代理一Proxy
  6. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
  7. 利用多写Redis实现分布式锁原理与实现分析(转)
  8. 关于nginx的限速模块
  9. Java 8新特性——default方法(defender方法)介绍
  10. [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
  11. springJDBC一对多关系,以及Java递归,jsp递归的实现
  12. Python练习题 025:判断回文数
  13. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)
  14. iOS-NSTimer-pause-暂停-引用循环
  15. 继承之后的使用注意事项_ArrayStoreException
  16. c#基础练习之if结构
  17. 关于lower_bound的使用
  18. pgsql获取表相关数据
  19. redis 分布式锁流程图
  20. com.nostra13.universalimageloader 加载displayImage图片时图片模糊的处理办法

热门文章

  1. C#-ado.net-属性扩展
  2. HTMLTestRunner修改Python3的版本
  3. jquery datatable(二)
  4. 【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)
  5. 浅谈 GPU图形固定渲染管线
  6. 【codevs1227】 方格取数 2
  7. Android异步加载
  8. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
  9. 深入学习 memset 函数
  10. Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn&#39;t load locSDK3: findLibrary returned null.