字符串NSString与NSMutableString
字符串就是一连串的字符序列,Objective-C中有两个字符串:NSString和NSMutableString,其中,NSString代表自负序列不可变的字符串,而NSMutableString则代表字符序列可变的字符串。
创建字符串
NSString代表字符序列不可变的字符串,NSString的功能非常强大,Objective-C的字符串处理比C语言字符串简单、易用的多。
NSString具有的功能如下:
1.创建字符串:创建字符串既可使用以init开头的实例方法,也可以使用以string开头的类方法,当然也可以直接用@""的形式给出字符串直接量。
2.读取文件或网络URL来初始化字符串
3.将字符串内容写入文件或URL
4.获取字符串长度,既可获取字符串内包括的字符个数,也可获取字符串包括的字节个数。
5.获取字符串中的字符或字节,既可获取指定位置的字符,也可获取指定范围的字符。
6.获取字符串对应的C风格字符串
7.连接字符串
8.分隔字符串
9.查找字符串内指定的字符和子串
10.替换字符串
11.比较字符串
12.字符串大小比较
13.对字符串中的字符进行大小写转换
实际上,NSString文档中还介绍还介绍了大量功能和方法,本书将介绍NSString最常用的功能。下面的程序示范了创建NSString对象的几种方式。
事例
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
unichar data[6] = {97, 98, 99, 100, 101, 102};
//使用Unicode数值数组初始化字符串
NSString* str = [[NSString alloc] initWithCharacters:data length:6];
NSLog(@"%@", str);
char* cstr = "Hello, iOS!";
//将C风格的字符串转换为NSString对象
NSString* str2 = [NSString stringWithUTF8String:cstr];
NSLog(@"%@", str2);
//将字符串写入指定文件
[str2 writeToFile:@"myFile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
//读取文件内容,用文件内容初始化字符串
NSString* str3 = [NSString stringWithContentsOfFile:@"main.m" encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",str3);
}
return 0;
}
上面程序中示范了3种创建NSString对象的方式,包括将一个Unicode数值数组转换为字符串,把C风格的字符串转换为NSString对象,读取文件内容初始化NSString对象等。
NSString的常用应用
得到NSString字符串后,接下来就可以调用NSString大量的功能性方法,这些方法的用法可以参考NSString的参考手册,此处以一个示例程序来介绍NSString类的用法。
#import <Foundation/Foundation.h>
int main(int argc, char * argv[])
{
@autoreleasepool {
NSString* str = @"Hello";
NSString* book = @"《疯狂iOS讲义》";
//在str后面追加规定的字符串
//原来的字符串对象并不改变,只是将新生成的字符串重新赋给str指针变量
str = [str stringByAppendingString:@",iOS!"];
NSLog(@"%@", str);
//获取字符串对应的C风格字符串
const char* cstr = [str UTF8String];
NSLog(@"获取的C字符串:%s", cstr);
//在str后面追加带变量的字符串。
//原来的字符串对象并不改变,只是将新生成的字符串重新赋给str指针变量
str = [str stringByAppendingFormat:@"%@是一本非常不错的图书。", book];
NSLog(@"%@",str);
NSLog(@"str的字符个数为:%lu",[str length]);
NSLog(@"str按UTF-8字符集解码后字节数为:%lu",[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
//获取str的前10个字符组成的字符串
NSString* s1 = [str substringToIndex:10];
NSLog(@"%@",s1);
//获取str从5到最后的字符串
NSString* s2 = [str substringFromIndex:5];
NSLog(@"%@",s2);
//获取str从第五个字符开始,到第15个字符组成的字符串
NSString* s3 = [str substringWithRange:NSMakeRange(5, 15)];
NSLog(@"%@", s3);
//获取iOS在str中出现的位置
NSRange pos = [str rangeOfString:@"iOS"];
NSLog(@"iOS在str中出现的开始位置:%ld, 长度为:%ld",pos.location , pos.length);
//将str的所有字符转为大写
str = [str uppercaseString];
NSLog(@"%@", str);
}
}
运行结果如图所示:
可变字符串(NSMutableString)
Nsstring类是不可变的类,即一旦NSString对象被创建,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
NSMutableString对象则代表一个字符序列可变的字符串,而且NSMutableString是NSString的子类,因此前面介绍的NSString所包含的方法,NSMutableString都可直接使用,NSMutableString对象也可直接当成NSString对象使用。
当一个NSMutableString被创建以后,通过NSMutableString提供的appendFormat:、appendString:、deleteCharactersInRange:、insertString:atIndex:、replaceCharactersInRange:withString、replaceOccurrencesOfString:withString:options:range:、setString:方法即可改变该字符串所包含的字符序列。
事例
下面的程序示范了使用NSMutableString来改变序列:
#import <Foundation/Foundation.h>
int main(int argc , char * argv[])
{
@autoreleasepool {
NSString* book = @"《疯狂iOS讲义》";
//创建一个NSMutableString对象
NSMutableString* str = [NSMutableString stringWithString:@"Hello"];
//追加固定字符串
//字符串所包含的字符序列本身发生了改变,因此无须重新赋值
[str appendString:@",iOS!"];
NSLog(@"%@",str);
//追加带变量的字符串
//字符串所包含的字符序列本身发生了改变,因此无须重新赋值
[str appendFormat:@"%@是一本非常不错的图书。", book];
NSLog(@"%@",str);
//在制定位置插入字符串
//字符串所包含的字符序列本身发生了改变,因此无须重新赋值
[str insertString:@"fkit.org" atIndex:6];
NSLog(@"%@",str);
//删除从位置6到位置12的所有字符
[str deleteCharactersInRange:NSMakeRange(6, 12)];
NSLog(@"%@",str);
//将从位置6到位置9的字符串替换成Objective-C
[str replaceCharactersInRange:NSMakeRange(6, 9) withString:@"Objective-C"];
NSLog(@"%@",str);
}
}
运行结果如图所示: