漫步IOS--字符串类NSString和NSMutable常用函数

本文介绍了Objective-C中NSString和NSMutableString的使用方法,包括初始化、字符串操作等,对比了两者特性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSString 是一个不可变字符串。NSMutable 是一个可变的字符串类。所有的NSString里的方法,NSMutable里面都有。先从NSString开始说起,然后再说NSMutable特有的方法。

这个不可变,是指字符串从分配空间之后存储了内容就不可变,如果将其指向另一块内存中的地址,那么他所代表的值是可以改变的。就好像下面的代码中用@“2344”;去赋值,这个是可以不停地改变的。是因为这样进行的更换只是更改了指针所指向的地址。

那么不可变体现在哪里?

给NSString分配好空间并初始化之后,再调用方法进行字符串操作,所有的结果都是返回一个新的字符串,原字符串没有任何改变。而可变字符串是对原字符串的修改。

对结果的处理有两种方式,要么新建一个NSString接收,要么就是直接用原字符串的指针变量接收,即将原变量的地址指向新的修改后的字符串的地址。

1初始化

使用常量进行初始化

NSString *_s = @"worlds";
使用构造方法初始化

NSString *_s1 = [[NSString alloc]init];

得提一句的是,上面的初始化基本等于废物,因为初始化之后的内存空间中的NSString是不可改变的,就是说这样的代码是初始化了一个空白的存储不了东西的内存,啥用处也没有。

正确的格式化初始化方法

NSString *_s4 = [[NSString alloc] initWithFormat:@"白眼一翻,世界瞬间与我无关--%@",_s];

这里提一句,在NSString里但凡有方法后面是Format,都有对应的只是把Format替换为String的方法,他们的区别就是,String结尾的方法都是对后面整个字符串参数的操作,而Format可以实现像上面那样的对操作字符串多一些格式化规定,所以我叫他格式化初始化方法。另外,init方法执行效率高,但是只能调用一次,后面再改值就只能使用getter和setter。

还有利用便利构造器初始化。所谓的便利构造器就是类似Java的静态方法,可以不用先alloc再init。我们直接调用初始化方法,省事一些,所以叫便利构造器。便利构造器的名字是固定的,前面的名字是类名,剩下的是with+变量名。

NSString *_s5 = [NSString stringWithFormat:@"所有走过的路都是必经之路--%@",_s3];

NSString *_s5 = [NSString stringWithString:_s3];
上面的方法实现的都是初始化一个字符串。只是一个特别的地方是,stringWithString是利用的享元模式,就是说,不管调用了多少次,其实都是返回的常量区的一个地址,并没有开辟新空间,而stringWithFormat是开辟了新空间再写入字符串的。

这是几个常用的初始化方法。


2 求字符串的长度

NSString *ts = @"abcdefg";
//lu是长整形无符号占位符,ld是长整形有符号占位符
NSLog(@"%lu", [ts length]);
这里得说一下的是,lenth方法返回的是NSUInteger类型,需要用lu作为占位符输出。


3 求下标对应的字符,类似Java中的charAt();

NSLog(@"%c",[ts characterAtIndex:6]);

4 取子字符串

和Java的有些不一样,OC是根据起点坐标和字串长度截取字符串,一共有两种书写方式:

//描述字串的数据类型:两个成员变量,一个从什么位置开始,第二个是读取几个字符
//默认的变量是无符号的,写成负数会转成很大的正数,就会打印出一堆东西
NSRange  range = {2,3};
NSLog(@"%@",[ts substringWithRange:range]);
//第二种
NSString *_subs = [ts substringWithRange:NSMakeRange(2, 3)];
NSLog(@"%@", _subs);

5 另外两种截取字符串的方法

//从指定位置截取到最后(包含给定位置)
NSLog(@"%@",[ts substringFromIndex:2]);
//从开始截取到指定位置(不包含给定位置)
NSLog(@"%@", [ts substringToIndex:5]);

6 判断前后缀

NSString *ts2 = @"abcdef";
//判断一个字符串是不是前缀
[ts hasPrefix:@"abc"];
//判断一个字符串是不是后缀
[ts hasSuffix:@"efg"];

7 比较大小

//比较大小(区分大小写的)
//如果第一个大于第二个,返回1,等于返回0,小于第二个返回-1
long l1 = [ts compare:ts2];
//比较大写,不区分大小写
long l2 = [ts caseInsensitiveCompare:ts2];

8 判断字符串是否相等

BOOL re = [ts isEqualToString:ts2];

9 字符串大小写转换

//转换成小写
NSString *s1 = [ts lowercaseString];
//转换成大写
NSString *s2 = [ts uppercaseString];
//首字母转换成大写
NSString *s3 = [ts capitalizedString];

10 字符串和数字之间的转换

//字符串和数字之间的转换
    NSString *ns1 = @"123";
    int i1 = [ns1 intValue];
    NSLog(@"%d",i1);

其他的数字类型依样画葫芦也可以找到的,不一一列举了。


11 字符串拼接

//字符串拼接
    NSString *ts5 = @"hello";
    NSString *ts6 = [ts5 stringByAppendingString:@" word"];
    NSLog(@"%@",ts5);
    
    ts6 = [ts5 stringByAppendingFormat:@"%@",ts6 ];
    NSLog(@"%@", ts6);
    //不管拼接还是改写,都是返回的新的字符串,原来的字符串是没有改变的
这里的拼接列举了两种,就如同上面介绍的,可以看出Format结尾的要比String结尾的强大和好用的多。

可变字符串NSMutableArray

1 初始化

这个初始化方法,NSString有的,NSMutableString都可以用,这里列举一种,并着重看一下第二种。

    NSMutableString *ms1 = [[NSMutableString alloc] initWithString:@"123"];
    NSMutableString *ms2 = @"test1".mutableCopy;
第二种方式是,可以通过调用mutableCopy将一个不可变的字符串的值拷贝到一个可变字符串中。注意并不是将一个不可变字符串变为可变字符串,而是将不可变字符串的值进行了拷贝而已。


2 插入字符串

//增
    [ms1 appendString:@"asdafaf"];
    [ms1 insertString:@"----------" atIndex:2];
    NSLog(@"%@",ms1);


3 删除部分字符串

[ms1 deleteCharactersInRange:NSMakeRange(2, 10)];
    NSLog(@"%@",ms1);

4 替换部分字符串

[ms1 replaceCharactersInRange:NSMakeRange(0, 3) withString:@"hey123"];
    NSLog(@"%@",ms1);
这里得提一下,这个所谓的替换的实际操作是:先根据范围将范围内的字符去掉,剩下的字符串分为前后两顿,然后将后面参数的字符串拼接进刚才断开的两个字符串中间。就是说,可能你中间删除的只是三个字符,但是你后面的参数可能传递的是5个字符,这五个字符依旧会全部出现在新的字符串中,整体字符串的长度增加了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值