您的位置:首页 > 移动开发 > IOS开发

iOS 5中的ARC和strong和weak关键字

2013-03-31 12:10 197 查看
       ARC 是 Objective-C 编译器的一个特性, 所有 ARC 相关的处理都会发生在你构建你的应用的时候。 ARC 不是运行时特性(除了其中的一点, weak 指针系统)。 它也不是你在其他编程语言中所了解的垃圾回收机制。

 
     ARC 所做的事情就是在你编译代码的时候,在那些你需要自己处理内存管理的地方,插入 retain 和 release。 这就使得 ARC 和手工内存管理的速度一样快, 有时还会更快一些, 因为它在后端进行了一些优化操作。

iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS
5 之前不支持ARC)

strong 用来修饰强引用的属性;
@property (strong) SomeClass * aObject; 
对应原来的 
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; 

weak 用来修饰弱引用的属性;
@property (weak) SomeClass * aObject; 
对应原来的 
@property (assign) SomeClass * aObject; 

strong. 这是以前的 “retain” 的一个代号。 strong 属性将会成为它所指对象的所有者。

weak. 这个属性表示弱引用指针。 当它指向的对象被销毁时,它会被自动的设置成 nil。Weak
是所有 outlet 属性推荐的声明关系,记住,在 outlet 上使用它

unsafe_unretained. 这和以前的 “assign” 等同。 你只需要在一些例外的情况下会应道它,并且当你在给 iOS 应用时,后面会讲到更多。

copy. 这个和之前是一样的。 它创建一个对象的拷贝,并且创建一个强引用关系。

assign. 你不再允许在对象上用这个修饰符, 但你仍然能在简单类型的值,比如 BOOL,int 和 float 中用到它。

__weak, __strong 用来修饰变量,此外还有 __unsafe_unretained, __autoreleasing 都是用来修饰变量的。
__strong 是缺省的关键词。
__weak 声明了一个可以自动 nil 化的弱引用。
__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

大多数时候,当你想在 Objective-C 和 Core Foundation 之间的对象相互转换时, 都会用 __bridge 关键字。 然而,也有时候,你想要把所有关系给 ARC 或者解除 ARC 的所有关系。 在这种情况下, 那么有两个其他的 bridging casts 关键字:

__bridge_transfer: 把所有关系给 ARC

__bridge_retained: 收回 ARC 的所有关系

总结一下:

当把所有关系从 Core Foundation 转换到 Objective-C 的时候, 你要使用 CFBridgingRelease()。

当把所有关系从 Objective-C 转换到 Core Foundation 的时候,你要使用 CFBridgingRetain()。

当你要临时的使用一个类型,而不想要更改所有关系时, 你要使用 __bridge。

注意: 不是所有的 Objective-C 和 Core Foundation 对象转换都是 toll-free bridged 的。 例如, CGImage 和 UIImage
就不能互相转换, CGcolor 和 UIColor 也不能。这个页面 列出了不能够互相替换的类型。

__bridge 转换,不仅限于 Core Foundation。 一些API 使用 void * 类型的指针, 可以让你存放任何类型的引用, 不管是 Objective-C 对象,还是 Core Foundation 对象; malloc() 分配的内存, 等等。 void * 表示法的意思是: 这是一个指针, 但是它实际的数据类型可以是任何东西。

我们将要把 非ARC的应用转换到 ARC。 简单来说, 我们不再需要调用 retain, release 和 autorelease 了, 但在一些特定情况下,我们还需要做一些特殊处理。

这里有三个方式能让你的应用做到 ARC 兼容:

Xcode 有一个自动转换工具, 他可以迁移你的源代码。(在 Xcode 菜单中, 选择 Edit->Refactor->Convert to Objective-C ARC)

你可以手工的转换这些文件。

你可以对那些你不想转换的文件禁用 ARC。 这对那些你不想混在一起的第三方库非常有用。
           在 Build Settings 屏幕中, 切换到 “All” 可以看到所有可用的设置(Basic选项仅仅显示最常用到的设置)。 搜索 “automatic”, 设置 Objective-C Automatic Reference Counting 选项为 YES。 设置一个项目范围的标记, 用来告诉 Xcode 你将要用
ARC 编译器来编译你的项目中所有的源文件。

           在项目全局开启了 ARC。 但是你也可以告诉编译器一些例外,让它忽略一些指定的文件, 通过 -fno-objc-arc 标记。
Xcode 将会为这些文件关闭 ARC。

引申阅读:
Beginning ARC in iOS 5 Tutorial Part 1:http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
ARC简介:http://blog.csdn.net/nicktang/article/details/6887569

分享到: 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: