黑马程序员技术交流社区

标题: 关于NSString的疑惑,求解答 [打印本页]

作者: chain    时间: 2014-6-25 12:04
标题: 关于NSString的疑惑,求解答
本帖最后由 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

那位同学解释一下?


作者: 刘元明    时间: 2014-6-25 12:29
本帖最后由 刘元明 于 2014-6-25 13:57 编辑

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

你说这是两个字符串对象还是一个对象?
作者: 刘元明    时间: 2014-6-25 13:59
两个字符串对象,但是字符串引用只有一个,也就是说改变的是字符串代表的指针的指向,你好好理解一下。
作者: libra    时间: 2014-7-1 00:11
**s1 是二级指针指向*s1,*s1指向 字符串”i love oc too“    当你调用函数的时候,**s1并没有改变(s1只是一个NSString类型,而且指向*s1),而是让**s1指向了调用函数的s(因为你传递的是s的地址给**s1),所以**s1指向了“i love ios”字符串,所以两个字符串没有任何冲突。
作者: yueyuanlin    时间: 2014-7-1 09:46
很好理解嘛,原来s是指向“ I love ios"的,只不过通过函数调用,将s的指向指向了"I love oc too",字符串都没有改变。
作者: libra    时间: 2014-7-1 11:10
yueyuanlin 发表于 2014-7-1 09:46
很好理解嘛,原来s是指向“ I love ios"的,只不过通过函数调用,将s的指向指向了"I love oc too",字符串都 ...

{:3_66:}说的就是指针的空间大小已经固定。。。还能指比自己长的或者断的?
作者: yueyuanlin    时间: 2014-7-1 19:21
找了个反例,看看。

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!






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