玩弄ARC:力释放的刺激?(Playing around with ARC: Force relea

2019-09-17 08:52发布

我目前正在玩弄ARC一点得到一些事情想通了,开始做实际的工作之前。 我没有设置这样的代码:

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

我预期n和weakN是零,为n =零; 应触发我眼中的释放? 不幸的是事实并非如此。 输出是 “>>>:(空)3”。 我缺少的是在这里吗?

另一件事是,我敢肯定,下面的代码是给我很难与引弧时:

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

我敢肯定,我有一些问题,类似的代码,电弧将初始化后直接释放对象,因为没有强有力的参考对象。 不幸的是,上述的输出是“>>>:3”。

这将是巨大的,得到这个东西作一些澄清。 我清楚地失去了一些东西在这里!

最好的问候,迈克尔·

Answer 1:

除了kevboh说的话,它也毫无意义,以创建像NSNumber的简单不变Foundation对象弱引用。 出于性能的考虑,基金很可能鬻您缓存的对象,而不是创建一个全新的一个。 如果现在没有,那么它可能在未来的版本。

其结果是,你可能不会被返回的对象的唯一所有者[[NSNumber alloc] initWithInt:3]不管你怎么想。



Answer 2:

嗯,你只是选择了一个糟糕的对象来测试这一点。 如果您使用的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";



Answer 3:

我预期n和weakN是零,为n =零; 应触发我眼中的释放? 不幸的是事实并非如此。 输出是 “>>>:(空)3”。 我缺少的是在这里吗?

ARC不起作用这样的。 对象的所有权是不确定; ARC可能扶着它,直到你的函数结束。 你不应该指望deallocs发生,而是当你打算所有权发生使用强/弱引用。



文章来源: Playing around with ARC: Force release irritation?