在开始实际工作之前,我目前正在玩一些 ARC 以弄清楚一些事情。我确实设置了以下代码:
NSNumber* n = [[NSNumber alloc] initWithInt:3];
__weak NSNumber* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);
我预计 n 和弱 N 为 nil,因为 n = nil; 应该触发我眼中的释放吗?不幸的是,它没有。输出为">>>:(空(3"。我在这里错过了什么?
另一件事是,我很确定,下面的代码在开始使用 arc 时让我很难过:
__weak NSNumber* weakN2 = [[NSNumber alloc] initWithInt:3];
NSLog(@">>>: %@", weakN2);
我很确定,我在类似的代码中遇到了一些问题,因为 arc 会在初始化后立即释放对象,因为没有对该对象的强引用。不幸的是,上述输出是">>>:3"。
如果能对这些东西进行一些澄清,那就太好了。我在这里显然错过了一些东西!
此致敬意迈克尔
除了kevboh所说的之外,创建对像NSNumber这样的简单不可变基金会对象的弱引用也是毫无意义的。出于性能原因,Foundation 可能会为您提供缓存对象,而不是创建一个全新的对象。如果现在没有,那么它可能会在未来的某个版本中发布。
结果是,无论你怎么想,你可能不是[[NSNumber alloc] initWithInt: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";
(
我预计 n 和弱 N 为 nil,因为 n = nil; 应该触发我眼中的释放吗?不幸的是,它没有。输出为">>>:(空(3"。我在这里错过了什么?
ARC 不是那样工作的。对象的所有权是不确定的;ARC 可能会一直坚持到您的功能结束。您不应期望发生 dealloc,而是在打算发生所有权时使用强/弱引用。