3

在开始实际工作之前,我目前正在使用 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"。

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

最好的问候,迈克尔

4

3 回答 3

3

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

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

于 2012-05-20T00:22:10.400 回答
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)

The behavior of NSNumber is caused because the class is caching the number that was created so is actually still valid. The same behavior will be exhibited if you use string constants that are compiled in as part of the code. (Like NSString* n = @"3";)

于 2012-05-20T02:40:17.337 回答
1

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

ARC 不是那样工作的。对象的所有权是不确定的;ARC 可能会一直坚持到您的功能结束。当您打算发生所有权时,您不应该期望会发生 deallocs,而是使用强/弱引用。

于 2012-05-19T23:47:24.567 回答