在Objective-C中使用ARC时,弱引用未设置为nil

时间:2014-07-11 13:30:40

标签: objective-c automatic-ref-counting

以下代码没有达到我的预期。

我们有一个强字符串和一个弱字符串。我对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)`

除非我误解,否则弱变量看起来变得强大。

1 个答案:

答案 0 :(得分:1)

这是因为当您以@"某个字符串"形式创建字符串时,编译器会创建所谓的NSCFConstantString,它具有无限引用计数,因此它永远不能解除分配。这是在内存中保持这种常量字符串的优化。尝试使用任何其他类(或由alloc / init创建的NSString),并且所有类都应按预期工作