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);
其他的数字类型依样画葫芦也可以找到的,不一一列举了。
//字符串拼接
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);
[ms1 deleteCharactersInRange:NSMakeRange(2, 10)];
NSLog(@"%@",ms1);
4 替换部分字符串
[ms1 replaceCharactersInRange:NSMakeRange(0, 3) withString:@"hey123"];
NSLog(@"%@",ms1);
这里得提一下,这个所谓的替换的实际操作是:先根据范围将范围内的字符去掉,剩下的字符串分为前后两顿,然后将后面参数的字符串拼接进刚才断开的两个字符串中间。就是说,可能你中间删除的只是三个字符,但是你后面的参数可能传递的是5个字符,这五个字符依旧会全部出现在新的字符串中,整体字符串的长度增加了。