NSString 是 Cocoa/Foundation 框架中使用頻率最高的類之一。本文系統整理創建、查詢、比較、搜索、截取、編碼轉換、路徑操作、格式化等核心方法,並標註常見陷阱與最佳實踐,作為開發速查手冊。
一、創建與初始化
| 場景 | 方法 | 備註 |
| 字面量 | @"text" | 編譯期常量,駐留內存 |
| 格式化 | [NSString stringWithFormat:@"%d-%@",
| 自動釋放池管理 |
| 文件讀取 | [NSString stringWithContentsOfFile:encoding:error:] | 指定編碼 (NSUTF8StringEncoding) |
| 數據轉換 | [[NSString alloc] initWithData:encoding:] | 持有實例需手動 release/ARC |
| 數值轉換 | [NSString stringWithFormat:@"%d", num] / @(num).stringValue | 後者為現代語法糖 |
二、基本屬性查詢
NSString *s = @"Hello 世界";
// 長度
NSUInteger len = s.length; // 字符數 (7)
NSUInteger bytes = [s lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; // 字節數 (11)
// 判空
BOOL empty = (s.length == 0); // 推薦
// 也可: [s isEqualToString:@""]
三、字符訪問與子串
| 操作 | 方法 | 示例 |
| 單字符 | characterAtIndex: | unichar c = [s characterAtIndex:0]; // 'H' |
| 範圍子串 | substringWithRange: | [s substringWithRange:NSMakeRange(0,5)] // "Hello" |
| 前綴 | substringToIndex: | [s substringToIndex:5] |
| 後綴 | substringFromIndex: | [s substringFromIndex:6] // "世界" |
注意:所有索引基於 UTF-16 代碼單元 (unichar),Emoji/補充平面字符佔 2 個代碼單元。
四、比較與匹配
// 精確比較
BOOL eq = [s1 isEqualToString:s2]; // 區分大小寫
BOOL eqCi = [s1 caseInsensitiveCompare:s2] == NSOrderedSame;
// 前綴/後綴
BOOL hasPre = [s hasPrefix:@"Hello"];
BOOL hasSuf = [s hasSuffix:@"世界"];
// 完整匹配選項
NSComparisonResult r = [s1 compare:s2
options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch
range:NSMakeRange(0, s1.length)
locale:[NSLocale currentLocale]];
五、搜索與範圍
| 需求 | 方法 | 返回 |
| 首次出現 | rangeOfString: | NSRange (location=NSNotFound 表示未找到) |
| 最後出現 | rangeOfString:options:NSBackwardsSearch | 同前 |
| 字符集搜索 | rangeOfCharacterFromSet: | 如尋找數字: [NSCharacterSet decimalDigitCharacterSet] |
| 所有匹配 | enumerateSubstringsInRange:options:usingBlock: | 塊回調枚舉 |
六、修改與拼接(返回新實例,原字符串不可變)
// 替換
NSString *replaced = [s stringByReplacingOccurrencesOfString:@"世界"
withString:@"Swift"];
// 刪除前後空白/換行
NSString *trimmed = [s stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// 大小寫
NSString *upper = [s uppercaseString];
NSString *lower = [s lowercaseString];
NSString *cap = [s capitalizedString]; // 每詞首字母大寫
// 拼接
NSString *joined = [@[@"A", @"B", @"C"] componentsJoinedByString:@","];
NSString *fmt = [NSString stringWithFormat:@"%@-%@", @"A", @"B"];
七、編碼轉換與數據交互
// NSString → NSData
NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
// NSData → NSString
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// URL 編碼
NSString *escaped = [s stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLQueryAllowedCharacterSet]];
// URL 解碼
NSString *unescaped = [escaped stringByRemovingPercentEncoding];
八、路徑操作(文件系統專用)
NSString *path = @"/Users/name/Docs/file.txt";
// 組件
NSArray *comps = [path pathComponents]; // @[@"/", @"Users", @"name", @"Docs", @"file.txt"]
// 最後組件
NSString *last = [path lastPathComponent]; // "file.txt"
// 擴展名
NSString *ext = [path pathExtension]; // "txt"
// 刪除擴展名
NSString *base = [path stringByDeletingPathExtension];
// 擴展路徑
NSString *abs = [path stringByExpandingTildeInPath]; // ~ → /Users/name
// 拼接路徑
NSString *newPath = [path stringByAppendingPathComponent:@"subdir"];
九、格式化規範速查
| 佔位符 | 含義 | 示例 |
%@ | Objective-C 對象 (description) | @"%@", obj |
%d/%i | 有符號整數 | @"%d", 42 |
%u | 無符號整數 | @"%u", 42u |
%lld | 64位整數 | @"%lld", 1LL<<40 |
%f | 浮點數 (默認6位小數) | @"%.2f", 3.14159 |
%p | 指針地址 | @"%p", ptr |
%% | 字面 % | @"100%%" |
十、常見陷阱與最佳實踐
- 不可變性:
NSString 實例創建後不可修改,所有「修改」方法返回新實例
- 編碼一致性:網絡/文件 I/O 必須顯式指定編碼,默認非 UTF-8
- 性能敏感場景:大量拼接用
NSMutableString 或 [NSArray componentsJoinedByString:],避免循環 stringWithFormat:
- 本地化:用戶可見字符串使用
NSLocalizedString(@"key", @"comment"),配合 .strings 文件
- 空指針安全:
[nil length] 返回 0,[nil isEqualToString:@""] 返回 NO,無需額外判空
- Emoji 處理:按字符枚舉用
enumerateSubstringsInRange:options:NSStringEnumerationByComposedCharacterSequences
總結
NSString 作為 Foundation 核心,API 設計兼顧 Unicode 正確性、內存安全、本地化支持。熟練掌握上述分類方法,配合現代 Objective-C 語法糖 (@(), 字面量語法),能顯著提升字符串處理代碼的可讀性、健壯性與性能。