黑马程序员技术交流社区

标题: Object-C中NSString等内存问题 [打印本页]

作者: 无声风铃    时间: 2015-4-9 20:58
标题: Object-C中NSString等内存问题
今天晚上在做作业时,发现个古怪的现象:
  1. NSString *str1 = @"hello";
  2.         
  3.         NSArray *arr1 = @[@"test",@"hello",@"world",@"nice"];
  4.         
  5.         // 这个方法比较的是地址
  6.         NSLog(@"%ld",[arr1 indexOfObjectIdenticalTo:str1]);
  7.         // 这个方法比较的是内容
  8.         NSLog(@"%ld",[arr1 indexOfObject:str1]);
复制代码
可是这个运行的结果是:
  1. 2015-04-09 20:56:17.209 Test[2154:396477] 1
  2. 2015-04-09 20:56:17.210 Test[2154:396477] 1
  3. Program ended with exit code: 0
复制代码

由此可见两个查找的结果是相同的。
为什么会这样啊?

作者: 无声风铃    时间: 2015-4-10 09:26
自己顶个,求指教。不明白为什么通过地址比较的时候,也可以找到所在的序列
作者: iMcG33k    时间: 2015-4-10 13:03
1不对么? 0是test    1是hello,这有啥问题
作者: 无声风铃    时间: 2015-4-10 13:58
iMcG33k 发表于 2015-4-10 13:03
1不对么? 0是test    1是hello,这有啥问题

1是对的,但是为什么str1和arr1[1]是使用的相同的内存呢
作者: Nicholas_Chow    时间: 2015-4-10 14:33
没有自己去实践,我想可能是跟字符串常量的存储方式有关。
字符串常量存储在常量存储区,给arr1[1]赋值@"hello"时,因为前面已经有一个@"hello"了,所以会直接使用之前的对象,不会再新建一个对象。
作者: 无声风铃    时间: 2015-4-10 16:56
Nicholas_Chow 发表于 2015-4-10 14:33
没有自己去实践,我想可能是跟字符串常量的存储方式有关。
字符串常量存储在常量存储区,给arr1[1]赋值@"he ...

好的  谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2