創建字符串
| 方式 | 代碼示例 |
| 字面量 | NSString *s = @"常量字符串"; |
| 空字符串 | [NSString string] / [[NSString alloc] init] |
| 複製現有 | [NSString stringWithString:other] / [[NSString alloc] initWithString:other] |
| 格式化 | [NSString stringWithFormat:@"%d", 42] / [[NSString alloc] initWithFormat:@"%@", obj] |
| 字符數組 | [NSString stringWithCharacters:chars length:len] |
| C 字符串 | [NSString stringWithUTF8String:cstr] / [[NSString alloc] initWithCString:cstr encoding:NSUTF8StringEncoding] |
| 文件/URL | [NSString stringWithContentsOfFile:path encoding:enc error:&err] |
比較操作
// 內容比較(推薦)
if ([str1 isEqualToString:str2]) { ... }
// 指針比較(極少用)
if (str1 == str2) { ... } // 同一對象
// 大小比較(排序用)
NSComparisonResult r = [str1 compare:str2]; // 區分大小寫
NSComparisonResult r = [str1 caseInsensitiveCompare:str2]; // 忽略大小寫
NSComparisonResult r = [str1 localizedCompare:str2]; // 本地化規則
// 返回: NSOrderedAscending(-1) / NSOrderedSame(0) / NSOrderedDescending(1)
常用屬性與轉換
NSUInteger len = [str length]; // 字符數 (UTF-16 代碼單元數)
BOOL empty = (len == 0);
// 大小寫轉換
NSString *upper = [str uppercaseString];
NSString *lower = [str lowercaseString];
NSString *cap = [str capitalizedString]; // 每詞首字母大寫
// 基本類型轉換
int i = [str intValue];
float f = [str floatValue];
double d = [str doubleValue];
BOOL b = [str boolValue]; // @"YES"/@"NO"/@"TRUE"/@"FALSE" (不區分大小寫)
// 字符串 ↔ 數據
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
分割與組合
// 分割為數組
NSArray *parts = [str componentsSeparatedByString:@","];
NSArray *lines = [str componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
// 組合數組為字符串
NSString *joined = [array componentsJoinedByString:@" | "];
截取子串
// 從開頭到索引 (不含)
NSString *prefix = [str substringToIndex:3];
// 從索引到結尾
NSString *suffix = [str substringFromIndex:3];
// 任意範圍
NSRange r = NSMakeRange(2, 4);
NSString *mid = [str substringWithRange:r];
拼接
NSString *s1 = @"Hello";
NSString *s2 = @"World";
// 格式化拼接
NSString *s3 = [NSString stringWithFormat:@"%@ %@", s1, s2];
// 追加拼接
NSString *s4 = [s1 stringByAppendingString:@" "];
NSString *s5 = [s1 stringByAppendingFormat:@" %@", s2];
查找與匹配
// 子串查找
NSRange r = [str rangeOfString:@"sub"];
if (r.location != NSNotFound) { /* 找到 */ }
// 正則表達式 (iOS 4+)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d+" options:0 error:nil];
NSArray *matches = [regex matchesInString:str options:0 range:NSMakeRange(0, [str length])];
// 前綴/後綴
BOOL hasPrefix = [str hasPrefix:@"pre_"];
BOOL hasSuffix = [str hasSuffix:@".txt"];
編碼處理
- 內部存儲:UTF-16 (unichar 數組)
- 常用編碼常量:
NSUTF8StringEncoding、NSASCIIStringEncoding、NSUnicodeStringEncoding
- 讀取未知編碼文件:
initWithContentsOfFile:usedEncoding:error: 自動檢測
現代最佳實踐
- 優先使用字面量
@\"...\" 和格式化 @\"%@\"
- 比較內容用
isEqualToString:,排序用 compare: 系列
- 大量拼接用
NSMutableString,最終 copy 歸檔
- 處理用戶輸入文本時注意 Unicode 正規化 (
precomposedStringWithCanonicalMapping)
- 文件 I/O 顯式指定
NSUTF8StringEncoding