我认为下面第二个例子的结果应该是" 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);
答案 0 :(得分:1)
定义类似
的字符串时// Sample 1
self.strongStr = @"Strong-String";
编译器实际上保持对该字符串的静态引用,如果要创建具有相同字符的另一个字符串,您会注意到两个字符串的内存地址都是相同的。编译器执行此操作以帮助在反复使用相同的字符串时节省内存,因此它不必每次都重新分配内存。这就是为什么字符串不会被解除分配,而手动分配/插入的字符串