NSString 是 Objective-C 語言中最常被使用的字串形式,原始 C 語言字串形式是由字元(Character)所組成,而 NSString 是由 Unichar 所組成,所能使用的位元數更廣,也能表達更多不同的字元,下面我們將介紹一些與 NSString 有關的常用語法。
如果開啟的是空白專案,在使用 NSString 語法時,可能需要引入其標頭檔,才能正常執行,下列程式碼是在以啟用 ARC(Automatic Reference Counting)機制的情況下為前提,ARC 機制可以讓您不必為變數所佔用的記憶體加以控管,如果您不想使用此機制,可以參考在 Xcode 4 中關閉 ARC 的方法一文,來針對部分的檔案或是整個專案關閉 ARC 機制。
#import <Foundation/NSString.h>
宣告與格式化
//建立字串物件
NSString *str = @"NSString";
//建立空字串
NSString *str =[[NSString alloc] init];
//與CString的轉換
char *cstring = "CString";
NSString *str = [[NSString alloc] initWithCString:cstring];
//字串格重新式化
NSString *str =[[NSString alloc] initWithString:@"NSString"];
str = [NSString stringWithFormat:@"This is %@", str];
NSLog(@"%@", str);
字串格式化 |
大小寫的轉換
//字串的大小寫轉換
NSString *str =[[NSString alloc] initWithString:@"NSString"];
//全部大寫
NSLog(@"%@",[str uppercaseString]);
//全部小寫
NSLog(@"%@",[str lowercaseString]);
//字首大寫
NSLog(@"%@", [str capitalizedString]);
字串的大小寫轉換 |
在 iOS 6 SDK 中,你可以使用 NSString 新的方法函式來變更字串的大小寫,新的方法函式加入了 NSLocale 的概念,使裝置在不同的語系設定下皆可以正確的轉換這些字串。
//全部大寫
NSString *upperString = [string uppercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"全部大寫: %@", upperString);
//全部小寫
NSString *lowerString = [string lowercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"全部小寫: %@", lowerString);
//只有字首大寫
NSString *capString = [string capitalizedStringWithLocale:[NSLocale currentLocale]];
NSLog(@"只有字首大寫: %@", capString)
iOS 6 SDK NSString 中新的方法函式 |
比較
//字串比較
NSString *str_A =[[NSString alloc] initWithString:@"NSString"];
NSString *str_B =[[NSString alloc] initWithString:@"nsstring"];
BOOL compare;
//字串區分大小寫比較
compare = [str_A isEqualToString:str_B];
//字串不區分大小寫比較
compare = [str_A caseInsensitiveCompare:str_B] == NSOrderedSame;
//搜尋字串
NSString *str =[[NSString alloc] initWithString:@"NSString"];
//有區分大小寫
NSRange search = [str rangeOfString:@"Str"];
//數字表示第幾字元開始有符合(從0開始)
NSLog(@"%i", search.location);
字串的收尋 |
擷取
//字串擷取
NSString *str =[[NSString alloc] initWithString:@"NSString"];
//擷取前五位元
NSLog(@"%@", [str substringToIndex:5]);
//擷取時略過前五位元
NSLog(@"%@", [str substringFromIndex:5]);
//從第二個位元開始擷取三個位元(第一個字符為第零位元)
NSLog(@"%@", [str substringWithRange:NSMakeRange(2, 3)]);
字串擷取 |
替換
//字串替換
NSString *str =[[NSString alloc] initWithString:@"NSString"];
NSString *_str;
//尋找字串並取代
_str = [str stringByReplacingOccurrencesOfString:@"NS" withString:@"CS"];
NSLog(@"%@", _str);
//尋找範圍並取代
_str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"*******"];
NSLog(@"%@", _str);
替換字串 |
排列
字串同時也可以做升冪或是降冪的排列,以降冪的方式舉例來說,數字通常會比英文字母獲得比較高的排序數值,而符號的排序數值又會比數自來的更高些,因此以降冪的排序結果,最後就會呈現符號 → 數字 → 英文字母這樣的排序方式,你可以參考關於兩個 NSString 字串之間的升冪與降冪排序一文,來獲得更多字串排列的資訊。
拆解
在某些情況下可能會需要拆解字串,例如文件內容的處理,或是分析從網路上擷取下來的字串等。在 NSString 類別中就有提供拆解的方法,並且將拆解所得到的字串分別置入 NSArray 中,你可以參考NSString 字串的拆解方法一文,來獲得更多字串拆解的資訊。
最後一個範例,為什麼要retain之後再做release ???
回覆刪除您可以試著使用 [str retainCount]看看得到的 Count 值,如果不先 retain 是無法 release 的,不過這邊算是我的 miss,感覺這樣做好像沒什麼意義,你可以直接指定 str 為 nil,或是在 iOS 5.0 SDK 中使用 ARC 機制,也可以避免產生此類問題。
刪除NSString *str =[[NSString alloc] initWithString:@"NSString"];
回覆刪除==> retainCount = 1
str = [NSString stringWithFormat:@"This is %@", str];
NSLog(@"%@", str);
==> retainCount = 1
[str retain];
==> retainCount = 2
[str release];
==> retainCount = 1
所以... 你的意思是要retainCount = 2的時候才能release ??? 但是release完之後,retainCount還是1耶...?
奇怪... 我用另一個程式重跑一次,
回覆刪除他的retainCount變成
NSString *str =[[NSString alloc] initWithString:@"NSString"];
==> retainCount = -1
str = [NSString stringWithFormat:@"This is %@", str];
NSLog(@"%@", str);
==> retainCount = 1
[str retain];
==> retainCount = 2
[str release];
==> retainCount = 1
但是確實沒有加retain,就作release,程式會死掉...
我最一開始是 -1 耶,不過無所謂啦,最早那樣寫是因為這全部的範例是連在一起寫的,不過我前面也說了這不是最好的方法,如果你確定不再此用此變數你可以設定成 nil 或是使用 ARC 機制來幫助您管理記憶體
回覆刪除了解~
回覆刪除我後來看了一些資料,好像是說... 你用的變數不只你會用到,
底層可能會幫你retain好幾次,或再幫你release好幾次...
所以我後來就都用@autoreleae {}
ios的記憶體管理實在太糟了...
是比較嚴謹啦,加油!
刪除牛奶大大您好 :)
回覆刪除請問如何得知字串裡面有幾個字呢? 我的猜測是用總長度除以一個字的長度 但是不知道怎麼實作
請大大解惑 :)
我找到方法囉 :) 不好意思!
刪除︿︿
刪除