NSString *myString = [NSString stringWithFormat:@"string1"];
__weak NSString *myString1 = myString;
myString= nil;
NSLog(@"%@, %@",myString,myString1);
我期待着null , null
。但输出是string1, (null)
. 为什么 myString1 仍然保持值,因为 myString 设置为 nil?
NSString *myString = [NSString stringWithFormat:@"string1"];
__weak NSString *myString1 = myString;
myString= nil;
NSLog(@"%@, %@",myString,myString1);
我期待着null , null
。但输出是string1, (null)
. 为什么 myString1 仍然保持值,因为 myString 设置为 nil?
Weak references only get zeroed when the object is deallocated. That object is not immediately deallocated (it's probably in an autorelease pool here, though there are many other reasons something might be held onto in different situations), so the reference stays alive.
尝试这样的事情:
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。
我认为内存管理指南中的这句话可能会回答您的问题
特别是,您不应该设计类,以便在您认为会调用 dealloc 时调用它。由于错误或由于应用程序拆除,可能会延迟或回避对 dealloc 的调用。
输出应该是(null), string1
,不是string1, (null)
。我猜你打错了。
您将一个引用显式设置为 nil,但另一个引用仍在定义范围内使用(因为您在 中使用它NSLog
)。因此,在使用完成之前,ARC 不会发布它。
弱参考没有坚持下去。您正在使用它的事实意味着 ARC 将保留它(通过不添加发布代码)。一旦使用完成,ARC 将释放对象,然后弱引用将被取消。