在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString。
在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样。
一、NSString对象
在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类,和Java中的String类非常相似,而且他的一些方法也是很类似的。
直接来看一下NSString的一些方法的使用:
1 // 2 // main.m 3 // 14_NSString 4 // 5 // Created by jiangwei on 14-10-11. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 int main(int argc, const charchar * argv[]) { 12 @autoreleasepool { 13 //NSString是不可变字符串,后面还会降到可变字符串 14 15 //1.--------------字符串的创建方式 16 NSString *string1 = @"hello"; 17 NSLog(@"%@",string1); 18 //和上面的方式是等价的 19 string1 = [[NSString alloc] initWithString:@"hello1"]; 20 NSLog(@"%@",string1); 21 //占位符,可以实现拼接字符串 22 //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的 23 string1 = [[NSString alloc] initWithFormat:@"hello %@",string1]; 24 NSLog(@"%@",string1); 25 //使用类方法创建字符串 26 string1 = [NSString stringWithString:@"hello1"]; 27 28 29 //2.--------------字符串的比较isEqualToString 30 //比较字符串的值 31 NSString *string2 = @"abcd"; 32 NSString *string3 = @"8888"; 33 BOOL isEquals = [string2 isEqualToString:string3]; 34 if(isEquals){ 35 }else{ 36 } 37 38 NSString *string8 = @"abc"; 39 NSString *string9 = @"abc"; 40 //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的 41 //string8和string9是局部变量,在栈中分配内存的 42 if(string8 == string9){ 43 NSLog(@"string8 == string9"); 44 }else{ 45 NSLog(@"string8 != string9"); 46 } 47 48 //下面的string11和string12还是在栈中分配内存的 49 NSString *string11 = [[NSString alloc] initWithString:@"abc"]; 50 NSString *string12 = [[NSString alloc] initWithString:@"abc"]; 51 if(string11 == string12){ 52 NSLog(@"string11 == string12"); 53 }else{ 54 NSLog(@"string11 != string12"); 55 } 56 57 //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了 58 NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"]; 59 NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"]; 60 if(string13 == string14){ 61 NSLog(@"string13 == string14"); 62 }else{ 63 NSLog(@"string13 != string14"); 64 } 65 66 //3.---------------------caseInsensitiveCompare方法 67 //区分大小写判断是否相等 68 NSString *string15 = @"zhangsan"; 69 NSString *string16 = @"ZAHNGSAN"; 70 NSComparisonResult result = [string15 caseInsensitiveCompare:string16]; 71 if(result == NSOrderedSame){ 72 }else{ 73 } 74 75 76 //4.---------------------compare方法 77 //比较两个字符串的大小 78 result = [string15 compare:string16]; 79 if(result == NSOrderedAscending){ 80 //升序 81 }else if(result == NSOrderedDescending){ 82 //降序 83 } 84 85 86 //5.---------------------length方法 87 NSString *string17 = @"abc"; 88 NSInteger len = [string17 length]; 89 NSLog(@"len=%ld",len); 90 91 92 //6.---------------------uppercaseString/lowercaseString 93 //转成大写 94 NSString *string18 = @"aEc"; 95 NSString *string19 = [string18 uppercaseString]; 96 string19 = [string18 lowercaseString]; 97 //首字符大写,其他的变成小写 98 [string18 capitalizedString]; 99 100 101 //7.---------------------TypeXXXValue 102 //数值转化方法 103 NSString *string20 = @"3.14"; 104 float value = [string20 floatValue]; 105 string20 = @"1"; 106 BOOL values = [string20 boolValue]; 107 108 109 //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange 110 //字符串的截取 111 NSString *string21 = @"abcdefg"; 112 //从开始位置截取到下标为3的字串(不包括3) 113 NSString *stringnews = [string21 substringToIndex:3]; 114 //从哪个index开始截取到尾部(包括3) 115 stringnews = [string21 substringFromIndex:3]; 116 //截取1~(3+1)部分的字串 117 NSRange range = {1,3}; 118 stringnews = [string21 substringWithRange:range]; 119 120 121 //9.----------------------stringByAppendingString/stringByAppendingFormat 122 //字符串的追加 123 NSString *string22 = @"Android"; 124 NSString *stringnew = [string22 stringByAppendingString:@"IOS"]; 125 stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"]; 126 127 128 //10.---------------------rangeOfString 129 //字符串的查找 130 NSString *string23 = @"www.iphonetrain.com/ios.html"; 131 NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围 132 if(rang.location == NSNotFound){ 133 //没找到 134 }else{ 135 //找到了 136 } 137 138 //11.----------------------characterAtIndex 139 //取出字符串中指定的char 140 NSString *string24 = @"abcdef"; 141 unichar c = [string24 characterAtIndex:3]; 142 143 144 } 145 return 0; 146 }
下面来看一下他的方法:
1、创建的方法
1 //1.--------------字符串的创建方式 2 NSString *string1 = @"hello"; 3 NSLog(@"%@",string1); 4 //和上面的方式是等价的 5 string1 = [[NSString alloc] initWithString:@"hello1"]; 6 NSLog(@"%@",string1); 7 //占位符,可以实现拼接字符串 8 //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的 9 string1 = [[NSString alloc] initWithFormat:@"hello %@",string1]; 10 NSLog(@"%@",string1); 11 //使用类方法创建字符串 12 string1 = [NSString stringWithString:@"hello1"];
这里用了四种方式去创建一个字符串,我们常用的方式一般是第一种。
第二种是对象方法创建的;
第三种是在创建字符串的时候可以实现字符串的拼接;
第四种是使用类的方法创建的。
2、比较字符串的值
1 //2.--------------字符串的比较isEqualToString 2 //比较字符串的值 3 NSString *string2 = @"abcd"; 4 NSString *string3 = @"8888"; 5 BOOL isEquals = [string2 isEqualToString:string3]; 6 if(isEquals){ 7 }else{ 8 }
这个方法简单,没什么好说的。但是这个方法要和我们之前说到的==方式判断相等的方式区分,==和isEqual方法一样,比较指针变量是否指向同一个对象的,但是在OC中对于字符串有一个特殊的地方,下面来看一下代码:
1 NSString *string8 = @"abc"; 2 NSString *string9 = @"abc"; 3 //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的 4 //string8和string9是局部变量,在栈中分配内存的 5 if(string8 == string9){ 6 NSLog(@"string8 == string9"); 7 }else{ 8 NSLog(@"string8 != string9"); 9 }
这里我们运行之后,发现用==判断也是相等的,这个原因和Java中的情形很相似,在Java中有一个常量池的概念,像这种方式创建的字符串,他们的值都是保存在一个常量池的,然后引用都是指向常量池中的那个对象,所以用==也是相等的,OC中的原因也是类似。
但是在来看一下下面的代码:
1 //下面的string11和string12还是在栈中分配内存的 2 NSString *string11 = [[NSString alloc] initWithString:@"abc"]; 3 NSString *string12 = [[NSString alloc] initWithString:@"abc"]; 4 if(string11 == string12){ 5 NSLog(@"string11 == string12"); 6 }else{ 7 NSLog(@"string11 != string12"); 8 }
我们发现用initWithString初始化方法创建的字符串他们的指针变量也是指向同一个对象的,所以这里要记住了,NSString类中的initWithString方法创建的字符串和NSString *str = @"demo"直接创建的方式是一样的,都是指向常量池中的一个对象。所以使用==判断是相等的,其他的NSString类中创建字符串的方法就不一样了,比如下面的代码:
1 //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了 2 NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"]; 3 NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"]; 4 if(string13 == string14){ 5 NSLog(@"string13 == string14"); 6 }else{ 7 NSLog(@"string13 != string14"); 8 }
用initWithFormat初始化方法创建出来的对象就不想等了。
所以要记住一点:initWithString初始化方法和直接创建字符串的效果一样,都是指向常量池中的NSString对象
3、比较两个字符串的大小方法
1 //4.---------------------compare方法 2 //比较两个字符串的大小 3 result = [string15 compare:string16]; 4 if(result == NSOrderedAscending){ 5 //升序 6 }else if(result == NSOrderedDescending){ 7 //降序 8 }
4、字符串的长度的方法
1 //5.---------------------length方法 2 NSString *string17 = @"abc"; 3 NSInteger len = [string17 length]; 4 NSLog(@"len=%ld",len);
5、转化字符串的大小写方法
1 //6.---------------------uppercaseString/lowercaseString 2 //转成大写 3 NSString *string18 = @"aEc"; 4 NSString *string19 = [string18 uppercaseString]; 5 string19 = [string18 lowercaseString]; 6 //首字符大写,其他的变成小写 7 [string18 capitalizedString];
6、数值转化的方法
1 //7.---------------------TypeXXXValue 2 //数值转化方法 3 NSString *string20 = @"3.14"; 4 float value = [string20 floatValue]; 5 string20 = @"1"; 6 BOOL values = [string20 boolValue];
7、字符串的截取方法
1 //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange 2 //字符串的截取 3 NSString *string21 = @"abcdefg"; 4 //从开始位置截取到下标为3的字串(不包括3) 5 NSString *stringnews = [string21 substringToIndex:3]; 6 //从哪个index开始截取到尾部(包括3) 7 stringnews = [string21 substringFromIndex:3]; 8 //截取1~(3+1)部分的字串 9 NSRange range = {1,3}; 10 stringnews = [string21 substringWithRange:range];
8、字符串的追加方法
1 //9.----------------------stringByAppendingString/stringByAppendingFormat 2 //字符串的追加 3 NSString *string22 = @"Android"; 4 NSString *stringnew = [string22 stringByAppendingString:@"IOS"]; 5 stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];
这里需要注意的是,每次追加完一个字符串之后,是返回一个新的字符串,因为NSString是不可变类。和Java中的String类很类似,如果用+去连接字符串都会重新创建一个字符串对象,Java中可以使用StringBuilder对象去解决这样的问题,在OC中也是有解决的,后面会说到一个可变字符串类
9、字符串的查找方法
1 //10.---------------------rangeOfString 2 //字符串的查找 3 NSString *string23 = @"www.iphonetrain.com/ios.html"; 4 NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围 5 if(rang.location == NSNotFound){ 6 //没找到 7 }else{ 8 //找到了 9 }
11、取出字符串中指定的char
1 //11.----------------------characterAtIndex 2 //取出字符串中指定的char 3 NSString *string24 = @"abcdef"; 4 unichar c = [string24 characterAtIndex:3];
二、NSMutableString对象
上面介绍了NSString对象的一些常用方法,但是OC中的NSString是不可变的对象,所以这里在介绍一下一个与其对应的可变对象:NSMutableString
看一下代码:
1 // 2 // main.m 3 // 15_NSMutableString 4 // 5 // Created by jiangwei on 14-10-12. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 //NSMutableString中的内容是可以修改的 12 //NSMutableString是继承NSString类的 13 int main(int argc, const charchar * argv[]) { 14 @autoreleasepool { 15 16 //1.--------------------创建字符串 17 //和NSString的创建方法相同 18 NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"]; 19 20 //但是不能使用以下方式创建 21 //因为以下方式创建的字符串是不可变的,其值是放到常量池中的,不可变得 22 //NSMutableString *string1 = @"hello"; 23 24 25 //2.---------------------insertString 26 //在源字符串中指定的index中插入字符串,不会产生新的对象 27 [string1 insertString:@"可变" atIndex:0]; 28 29 30 //3.---------------------appendString 31 //追加字符串,不会产生新的对象 32 [string1 appendString:@"可变"]; 33 34 35 //4.---------------------deleteCharactersInRange 36 //删除字符串中指定范围的字串内容 37 NSMutableString *string2 = [NSMutableString stringWithString:@"hello"]; 38 NSRange range = {1,3}; 39 [string2 deleteCharactersInRange:range]; 40 41 42 //5.---------------------replaceCharactersInRange 43 //替换字符串内容 44 NSMutableString *string3 = [NSMutableString stringWithString:@"hello"]; 45 NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围 46 [string3 replaceCharactersInRange:ranges withString:@"ee"]; 47 } 48 return 0; 49 }
这里主要是介绍了NSMutalbeString类和NSString类不同的地方。
1、创建方法
NSMutableString类的创建方式和NSString的创建方式差不多,只是有一点需要注意,NSMutableString不能使用直接方式去创建,因为直接方式创建的字符串都是在常量池中,而常量池中的值都是不可变的,所以不能创建的,同时initWithString创建出来的字符串也是不在常量池中的。这点需要和NSString区分一下。
2、在字符串中插入一个字串
1 //2.---------------------insertString 2 //在源字符串中指定的index中插入字符串,不会产生新的对象 3 [string1 insertString:@"可变" atIndex:0];
3、字符串的追加
1 //3.---------------------appendString 2 //追加字符串,不会产生新的对象 3 [string1 appendString:@"可变"];
这个追加方法和NSString是不一样的,他不会产生一个字符串对象。
4、删除字串
1 //4.---------------------deleteCharactersInRange 2 //删除字符串中指定范围的字串内容 3 NSMutableString *string2 = [NSMutableString stringWithString:@"hello"]; 4 NSRange range = {1,3}; 5 [string2 deleteCharactersInRange:range];
5、替换字符串
1 //5.---------------------replaceCharactersInRange 2 //替换字符串内容 3 NSMutableString *string3 = [NSMutableString stringWithString:@"hello"]; 4 NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围 5 [string3 replaceCharactersInRange:ranges withString:@"ee"];
从上面的这些方法中,我们也可以看到NSMutableString类是可变的,因为只有可变字符串是有增删改查操作的。
总结
这篇文章就介绍了Foundation框架中的字符串对象,有可变NSMutableString和不变NSString之分。