A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chain 中级黑马   /  2014-6-25 12:04  /  1518 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 chain 于 2014-6-25 17:09 编辑

NSString 创建出来的字符串是 不可变的,可是为什么通过指针可以改掉字符串的内容呢?
  1. #import <Foundation/Foundation.h>

  2. void test(NSString **s1)
  3. {
  4.     *s1 = @"i love oc too";
  5. }

  6. int main(int argc, const char * argv[])
  7. {
  8.    
  9.     NSString *s = @"i love ios";
  10.     NSLog(@"%@",s);
  11.    
  12.     test(&s);
  13.    
  14.     NSLog(@"%@",s);
  15.     return 0;
  16. }
复制代码

2014-06-25 12:03:33.351 test[303:303] i love ios
2014-06-25 12:03:33.352 test[303:303] i love oc too
Program ended with exit code: 0

那位同学解释一下?

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 刘元明 于 2014-6-25 13:57 编辑

你理解错了,NSString创建的字符串不可变,是指字符串本身不可以修改,也就是对“i love ios”不可以修改,而上面的操作是将字符串的地址传给了函数,函数做的是改变了字符串的指向。
回复 使用道具 举报
刘元明 发表于 2014-6-25 12:29
你理解错了,NSString创建的字符串不可变,是指字符串本身不可以修改,也就是对“i love ios”不可以修改, ...

你说这是两个字符串对象还是一个对象?
回复 使用道具 举报
刘元明 来自手机 中级黑马 2014-6-25 13:59:46
板凳
两个字符串对象,但是字符串引用只有一个,也就是说改变的是字符串代表的指针的指向,你好好理解一下。
回复 使用道具 举报
**s1 是二级指针指向*s1,*s1指向 字符串”i love oc too“    当你调用函数的时候,**s1并没有改变(s1只是一个NSString类型,而且指向*s1),而是让**s1指向了调用函数的s(因为你传递的是s的地址给**s1),所以**s1指向了“i love ios”字符串,所以两个字符串没有任何冲突。

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
很好理解嘛,原来s是指向“ I love ios"的,只不过通过函数调用,将s的指向指向了"I love oc too",字符串都没有改变。
回复 使用道具 举报
yueyuanlin 发表于 2014-7-1 09:46
很好理解嘛,原来s是指向“ I love ios"的,只不过通过函数调用,将s的指向指向了"I love oc too",字符串都 ...

{:3_66:}说的就是指针的空间大小已经固定。。。还能指比自己长的或者断的?
回复 使用道具 举报
找了个反例,看看。

NSString本身不允许修改内容及字符串的长度,如果要修改的话,可以使用NSMutableString。

NSMutableString是NSString的子类,所以,所有NSString的方法都适用于NSMutableString。



01.NSString *str1 = @"Welcome,same!";  
02.NSString *str2,*str3;  
03.NSMutableString *mstr;  
04.NSRange range;  
05.  
06.mstr = [NSMutableString stringWithString:str1];  
07.NSLog(@"%@",mstr);  
08.  
09.[mstr insertString:@"back " atIndex:9];  
10.NSLog(@"%@",mstr);  
11.  
12.[mstr insertString:@"How are you" atIndex:[mstr length]];  
13.NSLog(@"%@",mstr);  
14.  
15.[mstr appendString:@" in there?"];  
16.NSLog(@"%@",mstr);  
17.  
18.[mstr deleteCharactersInRange:NSMakeRange(29,9)];  
19.NSLog(@"%@",mstr);  
20.  
21.range = [mstr rangeOfString:@"How are you?"];  
22.if(range.location != NSNotFound){  
23.   [mstr deleteCharactersInRange:range];  
24.   NSLog(@"%@",mstr);  
25.}  
26.  
27.[mstr setString:@"Welcome,Sam!"];  
28.NSLog(@"%@",mstr);  
NSString *str1 = @"Welcome,same!";
NSString *str2,*str3;
NSMutableString *mstr;
NSRange range;

mstr = [NSMutableString stringWithString:str1];
NSLog(@"%@",mstr);

[mstr insertString:@"back " atIndex:9];
NSLog(@"%@",mstr);

[mstr insertString:@"How are you" atIndex:[mstr length]];
NSLog(@"%@",mstr);

[mstr appendString:@" in there?"];
NSLog(@"%@",mstr);

[mstr deleteCharactersInRange:NSMakeRange(29,9)];
NSLog(@"%@",mstr);

range = [mstr rangeOfString:@"How are you?"];
if(range.location != NSNotFound){
   [mstr deleteCharactersInRange:range];
   NSLog(@"%@",mstr);
}

[mstr setString:@"Welcome,Sam!"];
NSLog(@"%@",mstr);

运行结果:


Welocome,Sam!
Welocome,back Sam!
Welocome,back Sam!How are you
Welocome,back Sam!How are you in there?
Welocome,back Sam!How are you?
Welocome,back Sam!

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马