玩转 ARC:强制释放刺激



在开始实际工作之前,我目前正在玩一些 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,而是在打算发生所有权时使用强/弱引用。

相关内容

  • 没有找到相关文章

最新更新