文章目录
清楚系统提供了那些接口,可以实现哪些操作。
不可变字符串
一:创建
指的字符串的内容和长度不可变
NSString *string=[[NSString alloc]init];是没有意义的,因为这样取开辟出来的不可变对象空间,后续对字符串内容的添加是不可能完成的,因为字符串的内容和长度不可变。
NSString *string=[[NSString alloc]init];
NSLog(@"%p,%@",string,string);
string=@"hello world";
NSLog(@"%p,%@",string,string);
NSSting * string2=@"hello world";
NSLog(@"%p,%@",string,string);
前两次的地址是不一样的,第二次和第三次的地址是一样的。
第一次string内容是空的,第二次string内容是hello world
因为OC字符串的享元模式,可以节省内存资源,OC字符串创建的时候比较消耗内存,当创建不可变字符串的时候,系统会自动把那个常量放到数据缓冲区,当下一次使用的时候,它发现你是使用的相同的字符串内容,就会从缓冲区内把数据取出,无需创建新的对象。
1.C语言字符串转换成OC字符串对象
NSSting * string2=@"hello world";
NSLog(@"%p,%@",string,string);
const char *cString="utf-8 string"
string2=[[NSString alloc]initWithCString:cString encoding:NSUTF8StringEncoding];
NSLog(@"%p,%@",string,string);
或string2=[NSString stringWithCString:cString encoding:NSUTF8StringEncoding];
发现内存空间地址变了,string2指向的是另外一个对象,而且字符串的内容也发生了变化。
2.格式化字符串
string2=[NSString stringWithFormat:@"%@年%@月%@日",@"1970",@"1",@"1"];
二:拼接和分割
拼接
NSString *string1=@"www.";
NString *string2=@"baidu.com";
NSString string3=[NSString stringWithFormat:@"%@%@",string1,string2];
或用这种方式比如在string3后面拼接一段字符串
string3=[string3 stringByAppendingString:@"(百度网址)")]
string3=[string3 stringByAppendingFormat:@"%d年",1970];
分割
按字符串分割,后面的必须是我们已经有的字符串。返回的是一个数组对象,返回的中文是Unicode的编码形式。
NSArray *components=[string3 componentsSeparatedByString:@"."];
components=[string3 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString@".()"]];//将.()放到字符集合中,string3按.()三个符号分割字符串
获取长字符串中的某一段子串,结果中文仍然是中文:
NSString *substring =[string3 substringFromIndex:5];//从第五个元素开始取,返回结果包括第五个元素(下标从0开始数)
substring =[string3 substringToIndex:5];//取到5位置为止,返回结果并不包括最终的临界值5.
substring =[string3 substringWithRange:NSMakeRange(2,5)];//从2开始取,取5个字符长度,返回结果包括第2个元素。
字符串比较
NSString *string1=@"hello";
NSString*string2=@"hello";
if(string1==string2){
NSLog("等于");
}else{
NSLog("不等于");
}
string1和string2是指针,存的都是hello这个字符串常量的内存地址,所以会打印等于。但是在字符串比较的时候千万不要用这种方式,不可靠的。
用下面这种方式:
if([string1 isEqualToString:string2]){
NSLog("等于");
}else{
NSLog("不等于");
}
如果用stringWithFormat创建出的字符串,无论是否是之前使用过的字符串常量,都会新开辟出一个内存空间存放这个字符串的内容。并不会采用享元模式。
string2=[NSString stringWithFormat:@“hello”];
这样,第一种方法就会输出不等于,而第二种方法就会输出等于。
3.
string1=@"abc";
string2=@"abcd";
NSComparisonResult result=[string1 compare:string2];
switch(result){
case NSOrderedAscending://升序
NSLog(@"string1<string2");
break;
case NSOrderedSame:
NSLog(@"string1=string2");
break;
case NSOrderedDescending://降序
NSLog(@"string1>string2");
break;
}
返回结果是NSComparisionResult,有三个枚举值分别是升序降序还有相同。依次比较字符串中的ASCII码值,看是否相同,如果相同就继续往下比,如果比较到某一个比较大或小,就不会继续往下比较了,会直接返回结果。如果比较发现其中一个字符串已经到了最大长度,而另一个字符串后面还有字符存在,那么就会按字符串的长度进行比较了。
也可以用compare的方法来比较两个字符串是否相同。
其他方法
1.字符长度:
NSString *string=@"www.baidu.com";
NSLog("length=%zd",string.length);
2.字符里的字母都转换成大写:
NSLog(@"upper:%@",string.uppercaseString);
小写:lowercaseString
3.检验前缀:
BOOL result=[string hasPrefix:"www"];//检查是否有www的前缀,用此方法经常可以完成一些网址,手机号之类的判断
if(result){
NSLog("YES");
}else{
NSLog("NO");
}
后缀:hasSuffix
4.字符串中某段子串的范围
NSRange range=[string rangeOfString:@"baidu"];
NSLog(@"%@",NSStringFormRange(range));//直接打印结构体比较麻烦,所以转换成字符串打印。输出(4,5)从下标4开始,长度是5.
可变字符串
NSMutableString继承自NSString,所以也可以使用NSString的方法。
1.创建
NSMutableString *string=[[NSMutableString alloc]init];
可变指的是内存空间是可以被更改的,所以先创建一个空的可变字符串出来,后期再添加内容是没有问题的。
2.赋值
不能这样赋值:string=@“string”;类型首先就不匹配
可以这样:
[string setString:@"可变字符串"];
字符串清空:
[string setString:@""];
但不能传nil:[string setString:nil];会直接报错
3.追加字符串
[string appendString:@"www.baidu.com"];
4.插入字符串
[string insertString:@"(百度网址)" atIndex:4];
5.删除字符串
string deleteCharactersInRange:[string rangeOfString:@"(百度网址)"];
直接数可能数的不准确,所以可以用获取范围的函数
6.修改字符串内容
[string replaceCharactersInRange:NSMakeRange(0,5) withString:@"123"];//从下标0开始长度是5的字符串替换成123。后面的字符串长度和前面的范围没有关系。