玩弄ARC:强制释放刺激?

时间:2012-05-19 22:55:27

标签: objective-c automatic-ref-counting weak-references

在开始做实际工作之前,我目前正在玩ARC,以便弄清楚一些事情。我确实设置了这段代码:

NSNumber* n = [[NSNumber alloc] initWithInt:3];
__weak NSNumber* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);

我预计n和weakN为零,因为n = nil;应该引发我眼中的释放?不幸的是它没有。输出为“>>> :( null)3”。我在这里缺少什么?

另一件事是,我很确定,下面的代码在使用arc开始时给了我很多时间:

__weak NSNumber* weakN2 = [[NSNumber alloc] initWithInt:3];
NSLog(@">>>: %@", weakN2);

我很确定,我遇到了类似代码的一些问题,因为arc会在初始化后直接释放对象,因为没有对该对象的强引用。不幸的是,上面的输出是“>>>:3”。

对这些东西做一些澄清会很棒。我在这里显然遗漏了一些东西!

祝你好运, 迈克尔

3 个答案:

答案 0 :(得分:3)

除了kevboh所说的,创建对简单的不可变Foundation对象(如NSNumber)的弱引用也是毫无意义的。出于性能原因,Foundation可能会为您提供缓存对象,而不是创建一个全新的对象。如果它现在没有,那么它可能会在未来的某个版本中发布。

结果是,无论您怎么想,您可能不是[[NSNumber alloc] initWithInt:3]返回的对象的唯一所有者。

答案 1 :(得分:3)

好吧,你刚刚选了一个坏对象来测试它。如果你使用NSString(或大多数其他对象),你会得到预期的结果:

NSString* n = [[NSString alloc] initWithFormat:@"3"];
__weak NSString* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);
// Output is (null) (null)

__weak NSString* weakN2 = [[NSString alloc] initWithFormat:@"3"];
NSLog(@">>>: %@", weakN2);
// Output is (null)

导致NSNumber的行为是因为该类正在缓存创建的数字,因此实际上仍然有效。如果使用作为代码一部分编译的字符串常量,则会显示相同的行为。 (如NSString* n = @"3";

答案 2 :(得分:1)

  

我预计n和weakN为零,因为n = nil;应该引发我眼中的释放?不幸的是,它没有。输出为">>> :( null)3"。我在这里缺少什么?

ARC没有这样的工作。对象的所有权是不确定的; ARC可能会一直坚持到你的功能结束。你不应该期望发生deallocs,而是在你想要所有权发生时使用强/弱引用。