Objective c 理解弱引用

Objective c 理解弱引用,objective-c,automatic-ref-counting,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

我有以下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
会消失吗?为什么?

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

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

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

__weak NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil];
NSLog(@"%@", a);
在Xcode 4.6中,编译器将警告您后一种情况

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

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


因此,在这里,它将为弱对象指定传入值,而不保留它。由于您无法控制对象的生存期,因此您正在弱引用的对象只能生存,因为至少有一个其他对象持有对它的强引用。一旦情况不再如此,对象将被销毁,并且您的弱属性在使用一次后将自动设置为零。

为了学究的缘故:Retain Count已弃用,引用计数就是您所指的。自动引用计数。你能解释一下“使用一次后设置为零”吗?