在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样。
一、NSString对象
在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类,和Java中的String类非常相似,而且他的一些方法也是很类似的。
直接来看一下NSString的一些方法的使用:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//NSString是不可变字符串,后面还会降到可变字符串
//1.--------------字符串的创建方式
NSString *string1 = @"hello";
NSLog(@"%@",string1);
//和上面的方式是等价的
string1 = [[NSString alloc] initWithString:@"hello1"];
NSLog(@"%@",string1);
//占位符,可以实现拼接字符串
//[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
NSLog(@"%@",string1);
//使用类方法创建字符串
string1 = [NSString stringWithString:@"hello1"];
//2.--------------字符串的比较isEqualToString
//比较字符串的值
NSString *string2 = @"abcd";
NSString *string3 = @"8888";
BOOL isEquals = [string2 isEqualToString:string3];
if(isEquals){
}else{
}
NSString *string8 = @"abc";
NSString *string9 = @"abc";
//这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
//string8和string9是局部变量,在栈中分配内存的
if(string8 == string9){
NSLog(@"string8 == string9");
}else{
NSLog(@"string8 != string9");
}
//下面的string11和string12还是在栈中分配内存的
NSString *string11 = [[NSString alloc] initWithString:@"abc"];
NSString *string12 = [[NSString alloc] initWithString:@"abc"];
if(string11 == string12){
NSLog(@"string11 == string12");
}else{
NSLog(@"string11 != string12");
}
//下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了
NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
if(string13 == string14){
NSLog(@"string13 == string14");
}else{
NSLog(@"string13 != string14");
}
//3.---------------------caseInsensitiveCompare方法
//区分大小写判断是否相等
NSString *string15 = @"zhangsan";
NSString *string16 = @"ZAHNGSAN";
NSComparisonResult result = [string15 caseInsensitiveCompare:string16];
if(result == NSOrderedSame){
}else{
}
//4.---------------------compare方法
//比较两个字符串的大小
result = [string15 compare:string16];
if(result == NSOrderedAscending){
//升序
}else if(result == NSOrderedDescending){
//降序
}
//5.---------------------length方法
NSString *string17 = @"abc";
NSInteger len = [string17 length];
NSLog(@"len=%ld",len);
//6.---------------------uppercaseString/lowercaseString
//转成大写
NSString *string18 = @"aEc";
NSString *string19 = [string18 uppercaseString];
string19 = [string18 lowercaseString];
//首字符大写,其他的变成小写
[string18 capitalizedString];
//7.---------------------TypeXXXValue
//数值转化方法
NSString *string20 = @"3.14";
float value = [string20 floatValue];
string20 = @"1";
BOOL values = [string20 boolValue];
//8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
//字符串的截取
NSString *string21 = @"abcdefg";
//从开始位置截取到下标为3的字串(不包括3)
NSString *stringnews = [string21 substringToIndex:3];
//从哪个index开始截取到尾部(包括3)
stringnews = [string21 substringFromIndex:3];
//截取1~(3+1)部分的字串
NSRange range = {1,3};
stringnews = [string21 substringWithRange:range];
//9.----------------------stringByAppendingString/stringByAppendingFormat
//字符串的追加
NSString *string22 = @"Android";
NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];
//10.---------------------rangeOfString
//字符串的查找
NSString *string23 = @"www.iphonetrain.com/ios.html";
NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
if(rang.location == NSNotFound){
//没找到
}else{
//找到了
}
//11.----------------------characterAtIndex
//取出字符串中指定的char
NSString *string24 = @"abcdef";
unichar c = [string24 characterAtIndex:3];
}
return 0;
}
下面来看一下他的方法:
1、创建的方法
//1.--------------字符串的创建方式
NSString *string1 = @"hello";
NSLog(@"%@",string1);
//和上面的方式是等价的
string1 = [[NSString alloc] initWithString:@"hello1"];
NSLog(@"%@",string1);
//占位符,可以实现拼接字符串
//[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
NSLog(@"%@",string1);
//使用类方法创建字符串
string1 = [NSString stringWithString:@"hello1"];
这里用了四种方式去创建一个字符串
我们常用的方式一般是第一种
第二种是对象方法创建的
第三种是在创建字符串的时候可以实现字符串的拼接
第四种是使用类的方法创建的
2、比较字符串的值
//2.--------------字符串的比较isEqualToString
//比较字符串的值
NSString *string2 = @"abcd";
NSString *string3 = @"8888";
BOOL isEquals = [string2 isEqualToString:string3];
if(isEquals){
}else{
}
这个方法简单,没什么好说的
但是这个方法要和我们之前说到的==方式判断相等的方式区分,==和isEqual方法一样,比较指针变量是否指向同一个对象的,但是在OC中对于字符串有一个特殊的地方,下面来看一下代码:
NSString *string8 = @"abc";
NSString *string9 = @"abc";
//这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
//string8和string9是局部变量,在栈中分配内存的
if(string8 == string9){
NSLog(@"string8 == string9");
}else{
NSLog(@"string8 != string9");
}
这里我们运行之后,发现用==判断也是相等的,这个原因和Java中的情形很相似,在Java中有一个常量池的概念,像这种方式创建的字符串,他们的值都是保存在一个常量池的,然后引用都是指向常量池中的那个对象,所以用==也是相等的,OC中的原因也是类似。
但是在来看一下下面的代码:
//下面的string11和string12还是在栈中分配内存的
NSString *string11 = [[NSString alloc] initWithString:@"abc"];
NSString *string12 = [[NSString alloc] initWithString:@"abc"];
if(string11 == string12){
NSLog(@"string11 == string12");
}else{
NSLog(@"string11 != string12");
}
用initWithFormat初始化方法创建出来的对象就不想等了。
所以要记住一点:initWithString初始化方法和直接创建字符串的效果一样,都是指向常量池中的NSString对象
3、比较两个字符串的大小方法
//4.---------------------compare方法
//比较两个字符串的大小
result = [string15 compare:string16];
if(result == NSOrderedAscending){
//升序
}else if(result == NSOrderedDescending){
//降序
}
4、字符串的长度的方法
//5.---------------------length方法
NSString *string17 = @"abc";
NSInteger len = [string17 length];
NSLog(@"len=%ld",len);
5、转化字符串的大小写方法
//6.---------------------uppercaseString/lowercaseString
//转成大写
NSString *string18 = @"aEc";
NSString *string19 = [string18 uppercaseString];
string19 = [string18 lowercaseString];
//首字符大写,其他的变成小写
[string18 capitalizedString];
6、数值转化的方法
//7.---------------------TypeXXXValue
//数值转化方法
NSString *string20 = @"3.14";
float value = [string20 floatValue];
string20 = @"1";
BOOL values = [string20 boolValue];
7、字符串的截取方法
//8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
//字符串的截取
NSString *string21 = @"abcdefg";
//从开始位置截取到下标为3的字串(不包括3)
NSString *stringnews = [string21 substringToIndex:3];
//从哪个index开始截取到尾部(包括3)
stringnews = [string21 substringFromIndex:3];
//截取1~(3+1)部分的字串
NSRange range = {1,3};
stringnews = [string21 substringWithRange:range];
8、字符串的追加方法
//9.----------------------stringByAppendingString/stringByAppendingFormat
//字符串的追加
NSString *string22 = @"Android";
NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];
这里需要注意的是,每次追加完一个字符串之后,是返回一个新的字符串,因为NSString是不可变类。和Java中的String类很类似,如果用+去连接字符串都会重新创建一个字符串对象,Java中可以使用StringBuilder对象去解决这样的问题,在OC中也是有解决的,后面会说到一个可变字符串类
9、字符串的查找方法
//10.---------------------rangeOfString
//字符串的查找
NSString *string23 = @"www.iphonetrain.com/ios.html";
NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
if(rang.location == NSNotFound){
//没找到
}else{
//找到了
}
10、取出字符串中指定的char
//11.----------------------characterAtIndex
//取出字符串中指定的char
NSString *string24 = @"abcdef";
unichar c = [string24 characterAtIndex:3];