在开始做实际工作之前,我目前正在玩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”。
对这些东西做一些澄清会很棒。我在这里显然遗漏了一些东西!
祝你好运, 迈克尔
答案 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)
ARC没有这样的工作。对象的所有权是不确定的; ARC可能会一直坚持到你的功能结束。你不应该期望发生deallocs,而是在你想要所有权发生时使用强/弱引用。我预计n和weakN为零,因为n = nil;应该引发我眼中的释放?不幸的是,它没有。输出为">>> :( null)3"。我在这里缺少什么?