Objective-C裡核心的處理字串的類就是NSString和NSMutableString這兩個類,這兩個類完成了Objective-C中字串大部分功能的處理。這兩個類的最主要的區別是NSString建立賦值後不能動態修改長度和內容,除非給重新賦值。而NSMutableString類似與鏈表的,在建立賦值後可以進行修改長度,插入,刪除等操作。
註:以下代碼運行環境是:XCode 4.3.2 ,IOS 5.1。
NSString提供了許多建立和初始化新字串的方法。下面這個是建立常量字串的。 它是編譯到可執行檔中的NSString的執行個體,它不會在記憶體中消失。例子:
1、建立常量字串。
NSString *astring = @"我是字串";
2、NSString的記憶體位址
當我們聲明一個字串時,NSString *aString;
變數aString並不是真正包含一個字串對象,它是指向記憶體中字串對象的指標,我們稱之為物件識別碼,因為它是表示記憶體中的一個對象而不是儲存這個對象,指標是一個記憶體位置的地址,下面考慮用“==”來比較字串,來看個例子
NSString *string1 = @"我是甲一號";
NSString *string2 = @"我是甲一號";
BOOL result = string1==string2;
if(result){
NSLog(@"address:%p", string1);
NSLog(@"address:%p", string2);
}
運行列印結果:
2012-07-30 09:36:41.337 objectiveC[613:403] address:0x10485b478
2012-07-30 09:36:41.339 objectiveC[613:403] address:0x10485b478
說明result的值是YES,這裡對比的是記憶體位址,@"我是甲一號"儲存在文字常量區,string1和string2都指向這個字串,所以指向的是同一個地址。
如果這樣做
NSString *string1 = @"我是甲一號";
NSString *string2 = string1;
BOOL result = string1==string2;
這時候result的值也YES了
看個例子就明白了。下面是字串記憶體位址的例子
//記憶體指向 NSString *bstring = @"我是字串"; NSString *astring = [[NSString alloc] init]; NSLog(@"astring point address:0x%.8x", astring); NSLog(@"bstring point address:0x%.8x", bstring); astring=@"我是字串"; NSLog(@"重新賦值之後的astring point address:0x%.8x", astring); NSLog(@"astring:%@",astring);
列印結果如下:
2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc2012-06-14 11:35:31.227 NSString[2316:f803] 重新賦值之後的astring point address:0x000045bc2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字串
重新賦值後,astring 的地址和bstring地址一樣了。
3、NSString字串的比較
在NSString中,最直接的就是用isEqualTostring這個方法
NSString* string1 = @"我是甲一號"; NSString *string2 = @"我是甲一號"; BOOL result = [string1 isEqualToString:string2]; if (result) { NSLog(@"字串相同"); }
列印結果:2012-06-14 11:49:10.442 NSString[2481:f803] 字串相同
4、字串分割:
NSString *nstring = @"美國,加拿大,澳大利亞,津巴布韋,埃及"; NSArray *array = [nstring componentsSeparatedByString:@","]; for (int i = 0; i < [array count]; i++) { NSLog(@"string:%@", [array objectAtIndex:i]); }
結果:
2012-06-14 11:49:10.443 NSString[2481:f803] string:美國2012-06-14 11:49:10.443 NSString[2481:f803] string:加拿大2012-06-14 11:49:10.443 NSString[2481:f803] string:澳大利亞2012-06-14 11:49:10.443 NSString[2481:f803] string:津巴布韋2012-06-14 11:49:10.444 NSString[2481:f803] string:埃及
5、建立格式化字串
int a = 100; int b = 8; NSString *astring = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%d.這是第 %i 字串",a,b]]; NSLog(@"astring:%@",astring);
格式化輸出符號
%@ 對象%d, %i 整數%u 無符整形%f 浮點/雙字%x, %X 二進位整數%o 八進位整數%zu size_t%p 指標%e 浮點/雙字 (科學計算)%g 浮點/雙字%s C 字串%.*s Pascal字串%c 字元%C unichar%lld 64位長整數(long long)%llu 無符64位長整數%Lf 64位雙字%e 是實數,用科學計數法計的
6、用標準c建立字串:initWithUTF8String方法
char *Cstring = "我是字串"; NSString *astring = [[NSString alloc] initWithUTF8String:Cstring]; NSLog(@"astring:%@",astring);
結果:2012-06-14 13:47:23.956 NSString[2850:f803] astring:我是字串
7、在串中搜尋子串和替換
hasPrefixe 匹配字串頭
haSuffix 匹配字串的尾巴
NSString *string1 = @"卡拉是條狗"; NSString *string2 = @"狗狗叫卡拉"; //字串以開頭比較 if([string1 hasPrefix:@"卡拉"]) { NSLog(@"字串string1以卡拉開頭"); } //字串以結尾比較 if([string2 hasSuffix:@"卡拉"]) { NSLog(@"string2字串以卡拉結尾"); }
搜尋和替換
NSString *string = @"我們是 gong產 主義 接班人"; NSString *temp = @"gong產"; NSString *me = @"我"; NSRange rang = [string rangeOfString:temp]; NSRange rang1 = [string rangeOfString:me]; NSLog(@"搜尋的字串在string中起始點的index 為 %d", rang.location); NSLog(@"搜尋的字串在string中結束點的index 為 %d", rang.location + rang.length); NSLog(@"我 在字串 string中的起點的index 為 %d",rang1.location); //將搜尋中的字串替換成為一個新的字串 NSString *str = [string stringByReplacingCharactersInRange:rang withString:@"大產"]; NSLog(@"替換後字串為%@", str); //將字串中" " 全部替換成 * str = [string stringByReplacingOccurrencesOfString :@" " withString:@"*"]; NSLog(@"替換後字串為%@", str);
結果:
2012-06-14 14:07:44.762 NSString[3107:f803] 搜尋的字串在string中起始點的index 為 42012-06-14 14:07:44.764 NSString[3107:f803] 搜尋的字串在string中結束點的index 為 92012-06-14 14:07:44.764 NSString[3107:f803] 我 在字串 string中的起點的index 為 02012-06-14 14:07:44.765 NSString[3107:f803] 替換後字串為我們是 大產 主義 接班人2012-06-14 14:07:44.765 NSString[3107:f803] 替換後字串為我們是*gong產*主義*接班人
看到"我"字的index了嗎?第一位的索引值是0。