为什么ARC中的__weak指针没有设置为nil?

时间:2012-10-22 06:09:03

标签: objective-c ios automatic-ref-counting

  

可能重复:
  In xcode 4.5.1 , about ios ARC

这是我的代码(弧)

self.string1=@"aaa";
__weak NSString *temp= self.string1;

NSLog(@"string1  %@",self.string1);
NSLog(@"temp     %@",temp);

self.string1=nil;
NSLog(@"---after self.string1 = nil----");
NSLog(@"string1   %@",self.string1);
NSLog(@"temp      %@",temp);

我认为输出应该如下:

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      (null)

然而,当我在xcode4.5.1中运行它时,它让我感到困惑

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      aaa

任何人都可以帮助我,告诉我为什么temp = @“aaa”(它是__weak,在string1 = nil之后它应该是nil)

编辑: 嗨,大家好。我们会以错误的方向讨论吗? 也许NSLog是在核心基础功能参考中定义的。 ARC对核心基础功能的参数有一些规则就像NSLog一样?我们将_weak对象作为参数传递给NSLog,它会将_weak改为_autorelease?

1 个答案:

答案 0 :(得分:5)

@"aaa"是一个编译时常量,永远不会被释放。所以,即使你的弱指针是唯一的东西,它仍然是一个有效的对象。

使用alloc / initWithFormat:或类似字符串,使用运行时创建的字符串再次尝试实验,您应该会看到预期的结果。

<强>更新

现在自己测试了它仍然似乎没有按预期工作。有关此问题的进一步讨论here