Objective c 玩ARC:强制释放刺激?

Objective c 玩ARC:强制释放刺激?,objective-c,automatic-ref-counting,weak-references,Objective C,Automatic Ref Counting,Weak References,在开始实际工作之前,我目前正在使用ARC来解决一些问题。我设置了以下代码: NSNumber* n = [[NSNumber alloc] initWithInt:3]; __weak NSNumber* weakN = n; n = nil; NSLog(@">>>: %@ %@", n, weakN); 我期望n和weakN为零,因为n=零;应该让我的眼睛放松吗?不幸的是,事实并非如此。输出为“>>>:(null)3”。我错过了什么 另一件事是,我很确定,以下代码让我在开

在开始实际工作之前,我目前正在使用ARC来解决一些问题。我设置了以下代码:

NSNumber* n = [[NSNumber alloc] initWithInt:3];
__weak NSNumber* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);
我期望n和weakN为零,因为n=零;应该让我的眼睛放松吗?不幸的是,事实并非如此。输出为“>>>:(null)3”。我错过了什么

另一件事是,我很确定,以下代码让我在开始使用arc时遇到了困难:

__weak NSNumber* weakN2 = [[NSNumber alloc] initWithInt:3];
NSLog(@">>>: %@", weakN2);
我很确定,我在使用类似的代码时遇到了一些问题,因为arc会在初始化后直接释放对象,因为没有对对象的强引用。不幸的是,上面的输出是“>>>:3”

如果能澄清一下这件事就太好了。很明显,我遗漏了一些东西

致以最良好的祝愿, 迈克尔

我期望n和weakN为零,因为n=零;应该让我的眼睛放松吗?不幸的是,事实并非如此。输出为“>>>:(null)3”。我错过了什么


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

除了Kevbh所说的之外,对NStUnt之类的简单不可变的基础对象创建弱引用也是毫无意义的。出于性能原因,基金会很可能会让您缓存一个对象,而不是创建一个全新的对象。如果现在没有,那么它可能会在将来的某个版本中发布


结果是,您可能不是
[[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”

实际上,NSString具有相同的行为。我试过了,弱引用不是零。然而,它似乎与NSObject一起工作。实际上,如果您使用我提供的代码,它的行为并不相同。正如我所说,它不适用于字符串文本。此外,如果使用13或更大的值而不是3,则代码将按预期工作,因为它不会缓存更大的数字。感谢对此的澄清。因此,这基本上意味着从基础框架中对对象进行弱引用几乎不是一个好主意,因为实际上当对象被释放时,实际上是不存在的。您仍然必须手动将此类信息传递给您的对象!?很遗憾,我认为在这种情况下,根本不可能构建一个工作的弱数组对象。不,可以使用基础框架对象的弱引用。为什么你不能呢?你为什么关心你的弱引用何时/是否设置为零?我认为你错过了弱引用的要点。弱引用意味着引用对象不关心被引用对象何时被解除分配。如果引用对象在意,它将使用强引用。