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

app*_*ter 0 objective-c ios automatic-ref-counting

可能重复:
在xcode 4.5.1中,关于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);
Run Code Online (Sandbox Code Playgroud)

我认为输出应该如下:

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      (null)
Run Code Online (Sandbox Code Playgroud)

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

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      aaa
Run Code Online (Sandbox Code Playgroud)

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

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

jrt*_*ton 5

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

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

UPDATE

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