5

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

4

2 回答 2

12

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

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

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

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

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

于 2013-03-28T04:43:00.213 回答
0

弱引用不会延长它指向的对象的生命周期,并且会自动变为 nil

ARC 推出新的终身资格赛

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

(非原子,复制,强,弱)

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

于 2013-03-28T04:45:19.460 回答