4

我为下面的代码片段获得了相同的内存地址

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但它是如何发生的。请有人告诉我。这对我来说越来越奇怪了。

4

3 回答 3

5

str并且NSLog应该提供相同的内存地址,因为它是同一个对象并且没有进行新的分配。变量的两行strTest可能被编译器优化为单个NSString *strTest = @"2",并且由于NSString是不可变的,因此节省内存空间并将其指向@"2"在可执行文件的数据段中分配的相同字符串没有问题。

于 2013-06-28T12:15:18.433 回答
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]); 

您将看到索引为 1arr的对象和引用的对象str是一个相同的实例,因为它们是并且应该是相同的。

于 2013-06-28T12:30:18.727 回答
1

像@"2" 这样的字符串文字永远不会被释放,它们指向同一个内存,这意味着指针比较是正确的并且它们共享相同的地址。

于 2013-06-28T12:15:02.680 回答