NSString 是 Cocoa/Foundation 框架中處理不可變文本的核心類。本文系統整理其實例化、編碼、創建、格式化、拼接、比較、搜索、截取、文件讀寫等高頻操作,並對比 NSMutableString 可變對應方法,附帶代碼片段供速查。
// 基礎分配初始化
NSString *str = [[NSString alloc] init];
NSString *str = [[[NSString alloc] init] autorelease]; // 手動內存管理時代寫法
// 便利構造器(自動釋放池)
NSString *str1 = [NSString stringWithCString:"new String" encoding:NSASCIIStringEncoding];
NSString *str2 = [[NSString alloc] initWithCString:"new String" encoding:NSASCIIStringEncoding];
// str1 與 str2 語義等價,前者自動釋放,後者需手動 release
NSASCIIStringEncodingNSUTF8StringEncoding(最常用)NSUnicodeStringEncoding (UTF-16)NSString *str = @"Hello money~";
// 自動釋放
NSString *string = [NSString stringWithCString:"您好" encoding:NSUTF8StringEncoding];
// 手動管理
NSString *string = [[NSString alloc] initWithCString:"您好" encoding:NSUTF8StringEncoding];
printf)NSString *str = @"hello";
NSString *string = [NSString stringWithFormat:@"%@ world", str];
// 結果: "hello world"
NSString *string2 = [[NSString alloc] initWithFormat:@"%@ %d", @"Number:", 42];
| 佔位符 | 含義 |
|---|---|
%@ | NSString 實例 |
%d, %D, %i | 有符號整數 |
%u, %U | 無符號整數 |
%x | 十六進制小寫 |
%X | 十六進制大寫 |
%f | 浮點數 |
%c | 單字符 |
%s | C 風格字符串 |
%% | 字面 % |
typedef struct _NSRange {
unsigned int location;
unsigned int length;
} NSRange;
// 創建範圍
NSRange range = NSMakeRange(0, 5); // location=0, length=5
NSLog(@"location=%d, length=%d", range.location, range.length);
- (NSUInteger)length; // 返回字符數(非字節數)
- (NSString *)stringByAppendingString:(NSString *)aString;
- (NSString *)stringByAppendingFormat:(NSString *)format, ...;
NSString *str1 = @"hello";
NSString *str2 = @"world";
NSString *str3 = [str1 stringByAppendingString:str2]; // "helloworld"
NSString *str4 = [str2 stringWithFormat:@"%d...%d", 10, 20]; // "world10...20"
NSMutableString 操作(原地修改)// 創建
NSMutableString *mStr = [NSMutableString stringWithString:@"hello"]; // 自動釋放
NSMutableString *mStr2 = [[NSMutableString alloc] initWithString:@"hello"]; // 手動管理
// 追加
[mStr appendString:@" money"];
[mStr appendFormat:@" and %@", @"world"];
// 插入
[mStr insertString:@"OS " atIndex:4]; // "Mac OS X"
// 刪除
[mStr deleteCharactersInRange:NSMakeRange(0, 1)]; // 刪除首字符
- (BOOL)isEqualToString:(NSString *)aString; // 內容相等
- (BOOL)hasPrefix:(NSString *)aString; // 前綴
- (BOOL)hasSuffix:(NSString *)aString; // 後綴
NSString *s1 = @"Mac OS", *s2 = @"Mac Pro";
[s1 hasPrefix:@"Mac"]; // YES
[s2 hasSuffix:@"OS"]; // NO
- (NSRange)rangeOfString:(NSString *)aString;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)range;
NSString *text = @"hello world";
NSRange r = [text rangeOfString:@"he"]; // {0, 2}
if (r.location != NSNotFound) { ... }
// 常用選項掩碼
NSCaseInsensitiveSearch // 忽略大小寫
NSLiteralSearch // 逐字節比較,較快
NSBackwardsSearch // 從尾部向前搜索
NSAnchoredSearch // 僅匹配指定範圍開頭
- (NSString *)substringToIndex:(NSUInteger)anIndex; // [0, index)
- (NSString *)substringFromIndex:(NSUInteger)anIndex; // [index, end]
- (NSString *)substringWithRange:(NSRange)aRange; // 指定範圍
NSString *sub = [@"0123456789" substringWithRange:NSMakeRange(5, 2)]; // "56"
// 讀取(自動釋放)
NSError *error = nil;
NSString *content = [NSString stringWithContentsOfFile:@"/path/to/file.txt"
encoding:NSUTF8StringEncoding
error:&error];
if (content) { /* 成功 */ }
// 寫入
BOOL ok = [content writeToFile:@"/path/out.txt"
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
// 路徑展開 ~
NSString *path = @"~/data.txt";
NSString *abs = [path stringByExpandingTildeInPath];
// 獲取擴展名
NSString *ext = [path pathExtension];
string... 前綴的類方法返回自動釋放對象(ARC 環境下無需關心)。alloc] init... 返回持有者,手動管理需 release,ARC 下自動釋放。NSMutableString 方法多為 void 返回,原地修改,無新對象產生。熟練掌握 NSString 與 NSMutableString 的上述方法,能覆蓋 90% 以上的文本處理場景。實際開發中,優先使用字面量 @"" 與 stringWithFormat: 創建,文件操作務必檢查 NSError,搜索比較善用 options: 參數提升效率與準確度。