Objective c __弱引用对我来说仍然是个谜

Objective c __弱引用对我来说仍然是个谜,objective-c,Objective C,我期望null,null。但是输出是string1,(null)。当myString设置为nil时,为什么myString1仍然保留该值?输出应该是(null),string1,而不是string1,(null)。我猜你打错了 您将一个引用显式设置为nil,但另一个引用仍在定义的范围内使用(因为您在NSLog中使用它)。因此,在使用完成之前,ARC不会发布它 弱引用没有抓住它。您使用它的事实意味着ARC将保留它(通过不添加发布代码)。一旦使用完成,ARC将释放该对象,然后弱引用将为零。弱引用仅

我期望
null,null
。但是输出是
string1,(null)
。当myString设置为nil时,为什么myString1仍然保留该值?

输出应该是
(null),string1
,而不是
string1,(null)
。我猜你打错了

您将一个引用显式设置为nil,但另一个引用仍在定义的范围内使用(因为您在
NSLog
中使用它)。因此,在使用完成之前,ARC不会发布它



弱引用没有抓住它。您使用它的事实意味着ARC将保留它(通过不添加发布代码)。一旦使用完成,ARC将释放该对象,然后弱引用将为零。

弱引用仅在解除分配该对象时变为零。该对象没有立即解除分配(它可能在这里的自动释放池中,尽管在不同的情况下可能会保留一些其他原因),因此引用仍然有效。

我认为您的问题可以通过以下引用得到回答

特别是,您不应该设计类以使dealloc 当您认为它将被调用时调用。调用dealoc可能 被延迟或回避,要么是因为一个错误,要么是因为 应用程序被拆除


试着这样做:

 NSString *myString = [NSString stringWithFormat:@"string1"];
__weak NSString *myString1 = myString;
myString= nil;
NSLog(@"%@, %@",myString,myString1);
解释

您可能注意到有许多方法可以分配字符串或对象:

1) [NSString stringWithFormat:…]/[NSString alloc]initWithFormat:…]
2) [NSArray阵列WithArray:…]/[NSArray alloc]initWithArray:…]

(也适用于许多其他课程)


第一类方法返回一个自动释放的对象。第二个是非自动释放对象。实际上,如果在上面的代码中使用alloc+initWithFormat:而不是stringWithFormat:则不需要自动释放池来查看这两个对象是否为零。

这个问题与Xcode或iPhone无关。这是一个关于Objective-C的问题。对我来说,输出是
(null),string1
。它可能要到以后才会将弱引用归零(退出块等)。别难过——我不确定是否有人真的理解它(尽管许多人假装理解).但肯定的是,_弱而不是_强的一点是,它不会保留被指向的对象。这只是[NSString stringWithFormat]预期的自动释放行为。看看Chuck的答案和我在下面的评论。这一定是答案。在非弧形区域中,
[NSString stringWithFormat]
返回一个自动释放的对象,因此ARC大概也是这样编码的。如果我们改为
NSString*myString=[[NSString alloc]initWithFormat:@“string1”]我们得到发问者期望的零输出。@SteveWaddicor;不一定保证解除分配的顺序或时间。事实上,打开优化器可能会使事情更快地解除分配(因为优化器将有效地消除
retain/autorelease
序列)。感谢您的回答。我也期待着同样的结果。
NSString *myString;
NSString* __weak myString1;
@autoreleasepool{
    myString= [NSString stringWithFormat:@"string1"];
    myString1= myString;
    myString= nil;
}
NSLog(@"%@, %@",myString,myString1);