注册 登录
主题 : 切割字符串NSString为什么结果不会变化呢
级别: 新手上路
UID: 657732
精华: 0
发帖: 12
可可豆: 66 CB
威望: 66 点
在线时间: 28(时)
注册时间: 2018-07-09
最后登录: 2018-09-17
0 楼:  发表于: 2018-07-10 12:55    发自: Web Page
来源于 一般提问 分类

切割字符串NSString为什么结果不会变化呢   



NSString * substr1(NSString* string) {
    NSString *result = [[string copy] autorelease];
    
    result = [string substringToIndex:string.length-1];
    
    
    return result;
    
}

调用:

NSString * str=@"asdf";
NSString * result=substr1(str);
NSLog(@"value:%@,%@", result,str);

//结果是asd,asdf  

1、substr1函数里result  和传入参数str 不是属于指针复制吗,为什么不会改变原来的值呢
2、怎么样才能改变原来的值
级别: 精灵王

状态: 连续签到 - [23天]
UID: 431391
精华: 0
发帖: 1719
可可豆: 2247 CB
威望: 2192 点
在线时间: 3076(时)
注册时间: 2015-01-20
最后登录: 2018-09-24
1 楼:  发表于: 2018-07-10 13:17    发自: Web Page
先不讲别的问题

NSString    本身就是不可字符串
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2287
可可豆: 3689 CB
威望: 3610 点
在线时间: 1836(时)
注册时间: 2012-02-15
最后登录: 2018-09-18
2 楼:  发表于: 2018-07-10 13:37    发自: Web Page
我来看看大家有什么高见
<null>
级别: 精灵王
UID: 164303
精华: 0
发帖: 3084
可可豆: 3433 CB
威望: 3410 点
在线时间: 5143(时)
注册时间: 2012-09-02
最后登录: 2018-09-24
3 楼:  发表于: 2018-07-10 13:44    发自: Web Page
进入函数后



1,result 指向了 str 指向的内存
2,result 再"重新"指向了一段新开辟的内存块
3,函数返回result


级别: 新手上路
UID: 657732
精华: 0
发帖: 12
可可豆: 66 CB
威望: 66 点
在线时间: 28(时)
注册时间: 2018-07-09
最后登录: 2018-09-17
4 楼:  发表于: 2018-07-11 09:58    发自: Web Page
回 3楼(noah1985) 的帖子
大神,第二个问题呢
级别: 精灵王
UID: 164303
精华: 0
发帖: 3084
可可豆: 3433 CB
威望: 3410 点
在线时间: 5143(时)
注册时间: 2012-09-02
最后登录: 2018-09-24
5 楼:  发表于: 2018-07-11 10:18    发自: Web Page
Re:回 3楼(noah1985) 的帖子
引用
引用第4楼baser于2018-07-11 09:58发表的 回 3楼(noah1985) 的帖子 :
大神,第二个问题呢


原来的值是一个不可变的字符串对象,所以值不能变。只能改变str的指向。
级别: 新手上路
UID: 631498
精华: 0
发帖: 10
可可豆: 10 CB
威望: 10 点
在线时间: 58(时)
注册时间: 2017-12-28
最后登录: 2018-07-16
6 楼:  发表于: 2018-07-11 16:04    发自: Web Page
值传递与引用传递,你需要了解哈
级别: 新手上路
UID: 657732
精华: 0
发帖: 12
可可豆: 66 CB
威望: 66 点
在线时间: 28(时)
注册时间: 2018-07-09
最后登录: 2018-09-17
7 楼:  发表于: 2018-07-12 10:20    发自: Web Page
回 2楼(wszcug) 的帖子
求答1,2
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2287
可可豆: 3689 CB
威望: 3610 点
在线时间: 1836(时)
注册时间: 2012-02-15
最后登录: 2018-09-18
8 楼:  发表于: 2018-07-12 10:29    发自: Web Page
回 7楼(baser) 的帖子
第一问正如3楼所说,原因就是字符串比较特殊,是一个常量不可修改,只能拷贝后重新开辟内存

NSString *str1 = @"abcd";
    NSString *str2 = str1;
    
    NSLog(@"11111 str1地址=%x,str2地址=%x",str1,str2);
    
    str2 = @"abcde";
    
    NSLog(@"22222 str1地址=%x,str2地址=%x",str1,str2);






结果


2018-07-12 10:27:04.069322+0800 1111[26731:2619525] 11111 str1地址=5280d0,str2地址=5280d0
2018-07-12 10:27:04.069369+0800 1111[26731:2619525] 22222 str1地址=5280d0,str2地址=528110


可见 开始 str1 和 str2的地址是相同的,指向了同一块内存,
当你尝试修改 str2 指向内存的内容是,按正常情况来讲,应该 是地址不变内容变,但实际上对于字符串这个特殊情况来讲,因为它是个常量,因此他就不能修改,
但代码确实允许你这么写了,那么str2 只能另外开辟新内存 重新赋值了
<null>
级别: 骑士

状态: 连续签到 - [168天]
UID: 535422
精华: 0
发帖: 251
可可豆: 1251 CB
威望: 926 点
在线时间: 722(时)
注册时间: 2015-12-31
最后登录: 2018-09-20
9 楼:  发表于: 2018-07-12 11:51    发自: Web Page
你传入一个可变的字符串试试,然后不要用substringToIndex:这个方法,这个方法是会生成一个新的NSString 对象

NSString * substr1(NSMutableString* string) {
    [string deleteCharactersInRange:NSMakeRange(string.length - 1, 1)];
    return string;
}
我是一个有基本原则的人,我的基本原则是:看心情

本站内容均为本站转发,已尽可能注明出处。因未能核实来源或转发内容图片有权利瑕疵的,请及时联系本站,本站会第一时间进行修改或删除。 QQ : 3442093904

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部