在以前的一篇文章中咱們說到了Foundation框架中的NSObject對象:html
http://blog.csdn.net/jiangwei0910410003/article/details/41788121java
那麼今天在在來繼續看一下Foundation框架中的經常使用對象:NSString和NSMutableStringios
在OC中NSString對象是不可變的,和Java中的String同樣的,而NSMutableString是可變的,和Java中的StringBuilder同樣。api
1、NSString對象app
在OC中,NSString對象是很是重要的一個對象,也是最基礎的一個對象,是用來處理字符串的經常使用類,和Java中的String類很是類似,並且他的一些方法也是很相似的。框架
直接來看一下NSString的一些方法的使用:iphone
// // main.m // 14_NSString // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #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.--------------字符串的建立方式 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"];這裏用了四種方式去建立一個字符串
咱們經常使用的方式通常是第一種ui
第二種是對象方法建立的spa
第三種是在建立字符串的時候能夠實現字符串的拼接
第四種是使用類的方法建立的
二、比較字符串的值
//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"); }咱們發現用initWithString初始化方法建立的字符串他們的指針變量也是指向同一個對象的,因此這裏要記住了,NSString類中的initWithString方法建立的字符串和NSString *str = @"demo"直接建立的方式是同樣的,都是指向常量池中的一個對象。因此使用==判斷是相等的,其餘的NSString類中建立字符串的方法就不同了,好比下面的代碼:
//下面的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"); }用initWithFormat初始化方法建立出來的對象就不想等了。
因此要記住一點:initWithString初始化方法和直接建立字符串的效果同樣,都是指向常量池中的NSString對象
三、比較兩個字符串的大小方法
//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"];
這裏須要注意的是,每次追加完一個字符串以後,是返回一個新的字符串,由於NSString是不可變類。和Java中的String類很相似,若是用+去鏈接字符串都會從新建立一個字符串對象,Java中可使用StringBuilder對象去解決這樣的問題,在OC中也是有解決的,後面會說到一個可變字符串類
//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];
上面介紹了NSString對象的一些經常使用方法,可是OC中的NSString是不可變的對象,因此這裏在介紹一下一個與其對應的可變對象:
NSMutableString
看一下代碼:
// // main.m // 15_NSMutableString // // Created by jiangwei on 14-10-12. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> //NSMutableString中的內容是能夠修改的 //NSMutableString是繼承NSString類的 int main(int argc, const char * argv[]) { @autoreleasepool { //1.--------------------建立字符串 //和NSString的建立方法相同 NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"]; //可是不能使用如下方式建立 //由於如下方式建立的字符串是不可變的,其值是放到常量池中的,不可變得 //NSMutableString *string1 = @"hello"; //2.---------------------insertString //在源字符串中指定的index中插入字符串,不會產生新的對象 [string1 insertString:@"可變" atIndex:0]; //3.---------------------appendString //追加字符串,不會產生新的對象 [string1 appendString:@"可變"]; //4.---------------------deleteCharactersInRange //刪除字符串中指定範圍的字串內容 NSMutableString *string2 = [NSMutableString stringWithString:@"hello"]; NSRange range = {1,3}; [string2 deleteCharactersInRange:range]; //5.---------------------replaceCharactersInRange //替換字符串內容 NSMutableString *string3 = [NSMutableString stringWithString:@"hello"]; NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出須要替換字符串的範圍 [string3 replaceCharactersInRange:ranges withString:@"ee"]; } return 0; }這裏主要是介紹了NSMutalbeString類和NSString類不一樣的地方
一、建立方法
NSMutableString類的建立方式和NSString的建立方式差很少,只是有一點須要注意,NSMutableString不能使用直接方式去建立,由於直接方式建立的字符串都是在常量池中,而常量池中的值都是不可變的,因此不能建立的,同時initWithString建立出來的字符串也是不在常量池中的。這點須要和NSString區分一下
二、在字符串中插入一個字串
//2.---------------------insertString //在源字符串中指定的index中插入字符串,不會產生新的對象 [string1 insertString:@"可變" atIndex:0];
//3.---------------------appendString //追加字符串,不會產生新的對象 [string1 appendString:@"可變"];這個追加方法和NSString是不同的,他不會產生一個字符串對象
四、刪除字串
//4.---------------------deleteCharactersInRange //刪除字符串中指定範圍的字串內容 NSMutableString *string2 = [NSMutableString stringWithString:@"hello"]; NSRange range = {1,3}; [string2 deleteCharactersInRange:range];
//5.---------------------replaceCharactersInRange //替換字符串內容 NSMutableString *string3 = [NSMutableString stringWithString:@"hello"]; NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出須要替換字符串的範圍 [string3 replaceCharactersInRange:ranges withString:@"ee"];
總結
這篇文章就介紹了Foundation框架中的字符串對象,有可變NSMutableString和不變NSString之分。