en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

11.06.2012

關於 NSString 的二三事

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 字串的拆解方法一文,來獲得更多字串拆解的資訊。






10 則留言:

  1. 最後一個範例,為什麼要retain之後再做release ???

    回覆刪除
    回覆
    1. 您可以試著使用 [str retainCount]看看得到的 Count 值,如果不先 retain 是無法 release 的,不過這邊算是我的 miss,感覺這樣做好像沒什麼意義,你可以直接指定 str 為 nil,或是在 iOS 5.0 SDK 中使用 ARC 機制,也可以避免產生此類問題。

      刪除
  2. 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耶...?

    回覆刪除
  3. 奇怪... 我用另一個程式重跑一次,
    他的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,程式會死掉...

    回覆刪除
  4. 我最一開始是 -1 耶,不過無所謂啦,最早那樣寫是因為這全部的範例是連在一起寫的,不過我前面也說了這不是最好的方法,如果你確定不再此用此變數你可以設定成 nil 或是使用 ARC 機制來幫助您管理記憶體

    回覆刪除
  5. 了解~ 

    我後來看了一些資料,好像是說... 你用的變數不只你會用到,
    底層可能會幫你retain好幾次,或再幫你release好幾次...

    所以我後來就都用@autoreleae {}

    ios的記憶體管理實在太糟了...

    回覆刪除
  6. 匿名9/11/2014

    牛奶大大您好 :)
    請問如何得知字串裡面有幾個字呢? 我的猜測是用總長度除以一個字的長度 但是不知道怎麼實作
    請大大解惑 :)

    回覆刪除