我为以下代码片段获取了相同的内存地址
NSString *str = @"2";
NSArray *arr = [NSArray arrayWithObjects:@"1", str, @"3", @"4", @"5", @"6", nil];
NSString *strTest = @"6";
strTest = @"2";
NSLog(@"object %x", [arr objectAtIndex:1]);
对象“str”,“strTest”和“log print”给出相同的地址,虽然我已经为NSString
声明了不同的实例然后它是如何发生的。请有人让我知道。这对我来说很奇怪。
答案 0 :(得分:5)
str
和NSLog
应提供相同的内存地址,因为它是相同的对象,并且不会进行新的分配。 strTest
变量的两行可能由编译器优化为单个NSString *strTest = @"2"
,并且由于NSString
是不可变的,因此保存内存空间并将其指向相同内容没有问题在您的可执行文件的数据段中分配的@"2"
字符串。
答案 1 :(得分:4)
没有问题,因为它们是字符串文字。 str和strTest有两个不同的地址。它们只是碰巧转移到同一个对象,这是一个字符串文字。您尚未创建它们的两个单独实例。
尝试
str = [NSString stringWithFormat:"%@", @"2"];
strTest = [NSSTring stringWithString:str];
左右。 但是,如果你仍然这样做
NSArray *arr = [NSArray arrayWithObjects:@"1", str, @"3", @"4", @"5", @"6", nil];
然后
NSLog(@"object %x", [arr objectAtIndex:1]);
你会看到arr
中带有索引1的对象和str
引用的对象是一个相同的intance,因为它们是和它们应该是相同的。
答案 2 :(得分:1)
像@“2”这样的字符串文字永远不会被释放,它们指向相同的内存,这意味着指针比较为真,它们共享相同的地址。