【发布时间】:2012-12-16 12:31:12
【问题描述】:
可能重复:
Why do weak NSString properties not get released in iOS?
我是 Objective C 的新手,我有一些我自己无法回答的问题。 我有一段代码用于测试 __weak 变量(当然,我使用的是 ARC):
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
myString = nil; //<-- release the NSString object
NSLog(@"string: %@", weakString);
上述代码的输出符合预期,因为weakString是一个弱变量:
2013-01-02 11:42:27.481 ConsoleApp[836:303] string: (null)
但是当我把代码修改成这样的时候:
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
NSLog(@"Before: %@", weakString); //<--- output to see if the __weak variable really works.
myString = nil;
NSLog(@"After: %@", weakString);
输出完全不是我的预期:
2013-01-02 11:46:03.790 ConsoleApp[863:303] Before: John
2013-01-02 11:46:03.792 ConsoleApp[863:303] After: John
后一个 NSLog 的输出必须是 (nil) 而不是 "John"。我尝试在许多文档中进行搜索,但我没有找到这个案例的答案。 有人能给出合理的解释吗?提前致谢。
【问题讨论】:
-
@jrturton:我不认为这是链接问题的重复。那里的问题是使用常量
NSString,由于性能优化,它不参与通常的内存管理。这里的海报使用initWithFormat来避免这个问题。 -
我读过(但这次找不到)另一个这样的骗局,其中 NSString 的一些优化阻止了这项工作。如果 OP 尝试不同类型的对象,我怀疑一切都会按预期工作。我会继续寻找......
-
stackoverflow.com/questions/9202810/… 中的那个问题在我之前得到了解决。我很理解 initWithFormat 和 stringWithFormat 的概念。不管怎样,谢谢你的关心,我很感激。 :)
标签: ios weak-references strong-references