__弱参考对我来说仍然是一个谜

时间:2013-06-25 19:46:54

标签: objective-c

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

我期待null , null。但输出为string1, (null)。为什么myString1仍然保持该值,因为myString设置为nil?

4 个答案:

答案 0 :(得分:8)

弱对象仅在取消分配对象时归零。该对象不会立即被释放(它可能在这里的自动释放池中,尽管在不同的情况下可能会有许多其他原因),因此引用保持活跃。

答案 1 :(得分:3)

尝试这样的事情:

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

解释

您可能已经注意到有很多方法可以分配字符串或通常是对象:

1) [NSString stringWithFormat:...] / [[NSString alloc] initWithFormat:...] ;
2) [NSArray arrayWithArray:...] / [[NSArray alloc] initWithArray:...] ;
...

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

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

答案 2 :(得分:1)

我认为你的问题可以通过Memory Management Guide

的引用来回答
  

特别是,你不应该设计类以便dealloc   当您认为将调用时调用。调用dealloc可能   因为一个错误或因为一个错误而被延迟或回避   申请拆除。

答案 3 :(得分:0)

输出应为(null), string1,而不是string1, (null)。我猜你用错误的方式输入它。

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


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