NSString *myString = [NSString stringWithFormat:@"string1"];
__weak NSString *myString1 = myString;
myString= nil;
NSLog(@"%@, %@",myString,myString1);
我期待null , null
。但输出为string1, (null)
。为什么myString1仍然保持该值,因为myString设置为nil?
答案 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将释放该对象,然后弱引用将被填充。