为什么这个硬编码的字符串没有被释放,而alloc / inited呢?

时间:2016-03-01 01:48:51

标签: ios objective-c nsstring automatic-ref-counting weak-references

我认为下面第二个例子的结果应该是" null",但是在我运行代码之后,我发现在例1中输出是" Strong-String"在例2中,它是" null"

我真的不明白为什么会这样。

示例:

// property definition
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, weak)   NSString *weakString;

// Sample 1
self.strongStr  = @"Strong-String";
self.weakString = self.strongStr;
self.strongStr  = nil;
// output -> Strong-String
NSLog(@"waekstring = %@", self.weakString);

// Sample 2
self.strongStr  = [[NSString alloc] initWithUTF8String:"Strong-String"];
self.weakString = self.strongStr;
self.strongStr  = nil;
// output -> null
NSLog(@"waekstring = %@", self.weakString);

1 个答案:

答案 0 :(得分:1)

定义类似

的字符串时
// Sample 1
self.strongStr  = @"Strong-String";

编译器实际上保持对该字符串的静态引用,如果要创建具有相同字符的另一个字符串,您会注意到两个字符串的内存地址都是相同的。编译器执行此操作以帮助在反复使用相同的字符串时节省内存,因此它不必每次都重新分配内存。这就是为什么字符串不会被解除分配,而手动分配/插入的字符串