为什么nstring obj的内存地址和iOS dev中复制的不一样?

why is the nstring obj's memory address different from the copied one in iOS dev ?

     NSString * str1 = @"haha";
     NSString * str2 = [str1 copy];
     str1 = @"laa";
     NSLog(@"str1的地址为:%p", str1);
     NSLog(@"str2的地址为:%p", str2);
     NSLog(@"str1的值为:%@", str1);
     NSLog(@"str2的值为:%@", str2);

如上代码,它们的内存地址不同。但是如果我删除第三行,它们的内存地址是相同的。能告诉我原因吗?找了很久,谢谢

这是由于优化。在 iOS 上,每个唯一的字符串在内存中只存在一次 - 永远只有一个 haha NSString,无论你有多少次引用它,或者你在哪里创建它。但是在第三行中,您更改了原始字符串,而副本保持不变。因此,您现在有两个唯一的字符串。