ARC小结


1. Ownership Qualifiers

  • __strong -- 不使用任何修饰符的情况下,默认是__strong。在ARC环境下,编译器会自动为__strong修饰的对象指针生成恰当的release代码,比如出了对象所属作用域,或者发生指针赋值时。
  • __weak -- 使用__weak修饰符,编译器(准确说是Runtime System)会记录被修饰的指针,当指向对象被释放时,将用__weak修饰的指针全部置为nil。如果在非ARC环境下,假设a.delegate = b,通常delegate属性为assign,如果b被释放了,a继续用delegate指针访问,有可能导致程序崩溃。这时候可以模拟__weak特性,让b记录下a.delegate指针,在dealloc时将其置为nil。使用__weak指针,也可以消除循环引用
  • __unsafe__unretained -- 与__weak的差别就在于对象被释放后,不会将指针置为nil,所以最好是使用__weak,比较安全。通常为了支持iOS 4或者OS X 雪豹才使用__unsafe__unretained。
  • __autoreleasing -- 顾名思义,该修饰符是将对象指针向自动释放池注册。在ARC环境下,可以使用@autoreleasepool {} 快速建立自动释放池,并且编译器会关注函数返回值,在需要时为其进行注册。比如 + (id)array { return [[NSMutableArray alloc] init]; },按理说出了作用域,对象会被释放,但这里编译器会将该对象注册到自动释放池中。比如为了安全使用__weak指针,编译器也会自动将对象注册到自动释放池中。有一点不同的是,无修饰符的对象指针默认是__strong,而无修饰符的id指针(或者是对象指针的指针)则默认为__autoreleasing。

2. Rules of ARC

  • 忘掉retain、release、retainCount和autorelease。以前我们在需要安全使用一个对象时,往往会将该对象retain住,在不需要的时候进行release。在ARC环境下这么做会有编译错误,所以记住上面那四个修饰符就好。
  • 忘掉NSAllocateObject和NSDeallocateObject。我个人压根没用过这两个函数,具体可以查看这里这里这里以及这里
  • 创建对象的方法需要遵循一定的命名规则。以alloc、new、copy、mutableCopy开头的函数表示调用者对被创建的对象拥有所有权,以init开头的函数表示对对象进行初始化。这些函数需要是实例方法(而非类方法),并且返回一个对象。
  • 不要显示调用dealloc。比如在dealloc函数中不要加[super dealloc],否则会有错误“ARC forbids explicit message send of 'dealloc' ”。
  • 使用@autoreleasepool代替NSAutoreleasePool
  • 忘掉NSZone。关于NSZone,这里有一份详细文档。
  • 对象类型变量不能作为C语言中结构体(struct)或共用体(union)的成员
  • id和void *必须显示转换。这里涉及到三个关键字:__bridge、__bridge_retained和__bridge_transfer,比如void *p = (__bridge void *)obj。三个关键字分别表示没有所有权转移的类型转换、前后都拥有所有权的类型转换以及所有权转移(交接)的类型转换。

3. Implementation

  • __strong -- 编译器会帮我们在变量出作用域时添加release动作,如果该变量是函数返回值,增添加到自动释放池中。
  • __weak -- 编译器和Runtime System维护一张weak表,在给一个__weak指针赋值时,会将指针地址和指向对象作为key-value注册到表中。当指向对象被释放时,搜索表将指针置为nil,并移除该表项。
P.S. 还没真正用过ARC,以上只是很肤浅的“纸上谈兵”。另外,我觉得刚开始不用ARC比较好,能清晰地理解引用计数方式的内存管理,犯几次错误更深刻。LOL

原文地址: http://blog.csdn.net/jasonblog/article/details/7787050
Jason Lee @ Hangzhou

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值