理解弱参考

时间:2013-03-28 04:31:39

标签: objective-c automatic-ref-counting

我有以下启用ARC的代码

@property (nonatomic, weak) NSArray *a;
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.a = @[@1, @2];
    NSLog(@"ab is %@", self.a); //prints details of array
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{

    [super didReceiveMemoryWarning];
    for (id element in self.a) { //empty here
        NSLog(@"blah");
    }
    // Dispose of any resources that can be recreated.
}

这是我使用self.a的唯一地方。这是我编写的一个测试程序,用于调试我的一个问题。

当我模拟内存警告self.a消失了吗?为什么呢?

2 个答案:

答案 0 :(得分:9)

为了理解这一点,您必须了解参考计数。在Objective-C中,每个对象都有一个引用计数(即对象的强引用数)。如果没有强引用,则引用计数为0,并且对象将被取消分配。

self.a = @[@1, @2];创建一个自动释放的NSArray(意味着它将在稍后阶段自动释放)并将其分配给self.a。一旦自动释放池被耗尽,该阵列的引用计数为0(假设没有其他强引用)并且它被解除分配。作为弱变量的self.a自动设置为nil。

如果使用[[NSArray alloc] init]初始化数组并将其指定给弱指针,则在赋值后将立即释放该对象。在NSLog中,a将为nil

__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil];
NSLog(@"%@", a);

在Xcode 4.6中,编译器会警告你后一种情况。

答案 1 :(得分:0)

  

弱引用不会延长它指向的对象的生命周期   到,并自动成为零

ARC Introduces New Lifetime Qualifiers

它不会将引用计数增加1.它不会成为该对象的所有者,而只是拥有对它的引用。如果对象的引用计数降为0,即使您可能仍然在此处指向它,它也将从内存中释放。

(nonatomic, copy, strong, weak)

因此,对于您的弱对象,它将为其分配传入值而不保留它。而且由于您无法控制对象的生命周期,因此至少有一个其他对象拥有对它的强引用,因此您引用的对象只会依赖于它。一旦不再是这种情况,对象就会被破坏,你的弱属性在使用一次后会自动设置为nil。