字符串类
在Foundation框架中字符串类有两种:
NSString不可变字符串类和NSMutableString可变字符串类。
NSString是定义固定大小的字符串,
NSMutableString是可对字符串做追加、删除、 修改、 插入和拼接等操作而不会产生新的对象。
NSString类
NSSTring的类,用于处理字符串对象。然而C样式的字符串由char字符组成,NSString对象由unichar字符组成。
要使用Objective-C语言创建一个常量字符串对象,需要在字符串开头放置一个@字符。
创建字符串对象时,会创建一个内容不可更改的对象,这称为不可变对象。
需要制定一个范围确定子字符串,使用特殊的数据类型NSRange类创建对象。
实际上,它是结构的typedef定义,包含location和length两个成员。
如果没有找到这个字符串,则返回范围的location成员被设置为NSNotFound。
stringWithString:类级构造方法创建NSString对象,NSString构造方法还有很多;
length,返回Unicode字符的长度;
stringByAppendingString:实现了字符串的拼接,这个方法会产生下一新的对象;
isEqualToString:比较两个字符串是否相等;
compare: 比较两个字符串大小;
substringToIndex:可以获得字符串的前x个字符串;
substringFromIndex:可以截取x索引位置到尾部字符串;
rangeOfString:字符串查找;
stringByAppendingString:实现了字符串的拼接,这个方法会产生下一新的对象;
isEqualToString:比较两个字符串是否相等;
compare: 比较两个字符串大小;
substringToIndex:可以获得字符串的前x个字符串;
substringFromIndex:可以截取x索引位置到尾部字符串;
rangeOfString:字符串查找;
+(instancetype)stringWithContentOfFile:path encoding:enc error:err
或者:-(instancetype)initWithContentOfFile:path encoding:enc error:err
+(instancetype)stringWithContentOfURL:url encoding:enc error:err
+(instancetype)string创建一个新的空字符串
+(NSString *)stringWithFormat:
-(NSString *)substringWithRange:range
-(NSString *)capitalizedString返回首字母大写的字符串
-(const char*)UTF8String返回转换为UTF-8C样式的字符串
下面来看一段示例代码:
- #import <Foundation/Foundation.h>
- int main (int argc, const charchar * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- NSString *str1 = @"aBcDeFgHiJk";
- NSString *str2 = @"12345";
- NSString *res;
- NSComparisonResult compareResult;
- NSRange subRange;
- //字符个数
- NSLog(@"字符串str1长度: %i",[str1 length]);
- //拷贝字符串到res
- res = [NSString stringWithString: str1];
- NSLog(@"拷贝: %@", res);
- //拷贝字符串到str1尾部
- str2 = [str1 stringByAppendingString: str2];
- NSLog(@"连接字符串: %@", str2);
- //测试字符串相等
- if ([str1 isEqualToString: res] == YES) {
- NSLog(@"str1 == res");
- } else {
- NSLog(@"str1 != res");
- }
- //测试字符串 < > ==
- compareResult = [str1 compare: str2];
- if (compareResult == NSOrderedAscending) {
- NSLog(@ "str1 < str2");
- } else if (compareResult == NSOrderedSame) {
- NSLog(@ "str1 == str2");
- } else {
- NSLog(@ "str1 > str2");
- }
- res = [str1 uppercaseString];
- NSLog(@"大写字符串:%@", res);
- res = [str1 lowercaseString];
- NSLog(@"小写字符串:%@", res);
- NSLog(@"原始字符串: %@", str1);
- //获得前三个数
- res = [str1 substringToIndex: 3];
- NSLog(@"字符串str1的前三个字符: %@",res);
- res = [str1 substringFromIndex: 4];
- NSLog(@"截取字符串,从第索引4到尾部: %@",res);
- res = [[str1 substringFromIndex: 3] substringToIndex: 2];
- NSLog(@"截取字符串,从第索引3到5: %@",res);
- //字符串查找
- subRange = [str2 rangeOfString: @"34"];
- if (subRange.location == NSNotFound) {
- NSLog(@"字符串没有找到");
- } else {
- NSLog (@"找到的字符串索引 %i 长度是 %i",
- subRange.location, subRange.length);
- }
- [pool drain];
- return 0;
- }
我们解释一下主要代码:
str2 = [str1 stringByAppendingString: str2] 语句是将两个字符串对象拼接在一起,
由于NSString是不可变字符串类, 这会产生一个新的对象。
subRange = [str2 rangeOfString: @"34"] 中的rangeOfString: 方法会返回一个NSRange结构体,
它的location成员是找到的字符串的索引 , 它的length成员是找到的字符串的长度。
我们发现用initWithString初始化方法创建的字符串他们的指针变量也是指向同一个对象的,所以这里要记住了,NSString类中的initWithString方法创建的字符串和NSString *str = @"demo"直接创建的方式是一样的,都是指向常量池中的一个对象。所以使用==判断是相等的,其他的NSString类中创建字符串的方法就不一样了,用initWithFormat初始化方法创建出来的对象就不想等了。
NSMutableString 类
NSMutableString类可以用来创建可以更改字符的字符串对象。
注意,如果替换字符串中还包括搜索字符串(如:使用字符串“ax”替换字符串“a”),
那么将会陷入无限循环。
其实,这个是和它的实现原理有关系,一般这种替换使用的方法使用了递归调用。
stringWithString: 类级构造方法创建NSString对象,NSMutableString构造方法还有很多;
insertString: 插入字符串, 不会创建新的对象;
appendString: 追加字符串, 不会创建新的对象;
deleteCharactersInRange: 在一个范围内删除字符串, 不会创建新的对象;
replaceCharactersInRange: withString: 替换字符串, 不会创建新的对象;
insertString: 插入字符串, 不会创建新的对象;
appendString: 追加字符串, 不会创建新的对象;
deleteCharactersInRange: 在一个范围内删除字符串, 不会创建新的对象;
replaceCharactersInRange: withString: 替换字符串, 不会创建新的对象;
+(id)stringWithCapacity:size
或者:-(id)initWithCapacity:size
-(void)replaceOccurencesOfString:nsstirng withString:nsstring2 options:opt rang:rang
根据选项opts(NSBackwardsSearch从尾部开始查找 , NSAnchoredSearch匹配的范围查找, NSLiteralString逐行逐字比较查找, NSCaseInsensitiveSearch),将nsstring用nsstring2替换
再看断示例代码:
- #import <Foundation/Foundation.h>
- int main (int argc, const charchar * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- NSString *str1 = @"Objective C";
- NSString *search,*replace;
- NSMutableString *mstr;
- NSRange substr;
- //从不可变的字符创建可变字符串对象
- mstr = [NSMutableString stringWithString: str1];
- NSLog(@" %@", mstr);
- //插入字符串
- [mstr insertString: @ " Java" atIndex: 9];
- NSLog(@" %@", mstr);
- //具有连接效果的插入字符串
- [mstr insertString: @ " and C++"atIndex: [mstr length]];
- NSLog(@" %@", mstr);
- //字符串连接方法
- [mstr appendString: @ " and C"];
- NSLog(@" %@", mstr);
- //使用NSRange删除字符串
- [mstr deleteCharactersInRange:NSMakeRange(16, 13)];
- NSLog(@" %@", mstr);
- //查找字符串位置
- substr = [mstr rangeOfString: @ "string B and"];
- if (substr.location != NSNotFound) {
- [mstr deleteCharactersInRange: substr];
- NSLog(@" %@", mstr);
- }
- //直接设置可变字符串
- [mstr setString: @ "This is string A "];
- NSLog(@" %@", mstr);
- [mstr replaceCharactersInRange: NSMakeRange(8, 8)
- withString: @ "a mutable string "];
- NSLog(@" %@", mstr);
- //查找和替换
- search = @"This is ";
- replace = @"An example of ";
- substr = [mstr rangeOfString:search];
- if (substr.location != NSNotFound) {
- [mstr replaceCharactersInRange:substr withString: replace];
- NSLog(@" %@", mstr);
- }
- //查找和替换所有的情况
- search = @"a";
- replace = @"X";
- substr = [mstr rangeOfString: search];
- while (substr.location != NSNotFound) {
- [mstr replaceCharactersInRange:substr withString: replace];
- substr = [mstr rangeOfString: search];
- }
- NSLog(@" %@", mstr);
- //[mstr replaceOccurrencesOfString:search
- withString:replace
- options:nil
- rang:NSMakeRang(0,[mstr length])];
- [pool drain];
- return 0;
- }
我们解释一下主要代码:
语句[mstr deleteCharactersInRange:NSMakeRange(16, 13)] 是删除指定范围的字符串,
函数NSMakeRange 是创建NSRange结构体, 其中第一个参数是位置, 第二个参数是长度,
语句[mstr replaceCharactersInRange: NSMakeRange(8, 8) withString:@“a mutable string ”] 替换指定访问的字符串。
[mstr deleteCharactersInRange: substr] 语句是删除指定范围的字符串。