黑马程序员技术交流社区
标题: 关于NSString的疑惑,求解答 [打印本页]
作者: chain 时间: 2014-6-25 12:04
标题: 关于NSString的疑惑,求解答
本帖最后由 chain 于 2014-6-25 17:09 编辑
NSString 创建出来的字符串是 不可变的,可是为什么通过指针可以改掉字符串的内容呢?
- #import <Foundation/Foundation.h>
- void test(NSString **s1)
- {
- *s1 = @"i love oc too";
- }
- int main(int argc, const char * argv[])
- {
-
- NSString *s = @"i love ios";
- NSLog(@"%@",s);
-
- test(&s);
-
- NSLog(@"%@",s);
- return 0;
- }
复制代码
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 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
{: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 |