OC 弱引用 weak __weak assign __assign

来源:互联网 发布:jackson json 官网 编辑:程序博客网 时间:2024/04/29 02:47

弱引用

在计算机程序设计中,弱引用,与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。一些配有垃圾回收机制的语言,如JavaC#PythonPerlLisp等都在不同程度上支持弱引用。

垃圾回收用来清理不会再使用的对象,从而降低内存泄露和数据损坏的可能性。垃圾回收主要有两种类型:追踪和引用计数。引用计数会记录给定对象的引用个数,并在引用个数为零时收集该对象。由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。一组相互引用的对象若没有被其它对象直接引用,并且不可访问,则会永久存活下来。一个应用程序如果持续地产生这种不可访问的对象群组,就会发生内存泄漏。在对象群组内部使用弱引用(即不会在引用计数中被计数的引用)有时能避免出现引用环,因此弱引用可用于解决循环引用的问题。如Apple的Cocoa框架就推荐使用这种方法,具体为,在父对子引用时使用强引用,子对父引用时使用弱引用,从而避免了循环引用。

程序对一些对象只进行弱引用,通过此法可以指明哪些对象是不重要的,因此弱引用也用于尽量减少内存中不必要的对象存在的数量。

在Objective-C 2.0中,除了垃圾回收,自动引用计数也会受弱引用的影响。下面这个例子中的所有变量和属性都是弱引用。

@interface WeakRef : NSObject{    __weak NSString *str1;    __assign NSString *str2;} @property (nonatomic, weak) NSString *str3;@property (nonatomic, assign) NSString *str4; @end

weak(__weak)和assign(__assign)的区别在于,当变量指向的对象被重新分配时,变量的值是否会跟着改变。weak声明的变量会变为nil,而assign声明的变量则会保持不变,成为一个悬摆指针。从Mac OX 10.7 “狮子”系统和iOS 5开始,随着Xcode 4.1版本的推出,weak引用被引入到Objective-C语言中(4.2版本开始支持iOS)。老版本的Mac OS X、iOS和GNUstep仅支持用assign声明弱引用。


0 0
原创粉丝点击