以下代码没有达到我的预期。
我们有一个强字符串和一个弱字符串。我对ARC的理解是,当没有对弱变量的引用时,它将被释放,但是,弱字符串的最后一行仍然有一个值。
// Make a strong and weak variable
__strong NSString *strongString = @"Moo";
__weak NSString *weakString = nil;
weakString = strongString;
NSLog(@"weak: `%@` \t strong: `%@`", weakString, strongString);
// As expected this prints,
// weak: `Moo` strong: `Moo`
// Now set the weak reference to nil
weakString = nil;
NSLog(@"weak: `%@` \t strong: `%@`", weakString, strongString);
// As expected this prints,
// weak: `(null)` strong: `Moo`
// Now reset the weak variable and set the strong variable to nil
weakString = strongString;
strongString = nil;
NSLog(@"weak: `%@` \t strong: `%@`", weakString, strongString);
// Unexpectedly this prints,
// weak: `Moo` strong: `(null)`
// I was expecting to see weak: `(null)` strong: `(null)`
除非我误解,否则弱变量看起来变得强大。
答案 0 :(得分:1)
这是因为当您以@"某个字符串"形式创建字符串时,编译器会创建所谓的NSCFConstantString
,它具有无限引用计数,因此它永远不能解除分配。这是在内存中保持这种常量字符串的优化。尝试使用任何其他类(或由alloc / init创建的NSString),并且所有类都应按预期工作