NSString:不可變字符串
創建與初始化
// 1. alloc/init
NSString *s1 = [[NSString alloc] init]; // 空串
NSString *s2 = [[NSString alloc] initWithString:@"iPhone"];
// 2. 字面量(常量區)
NSString *s3 = @"iPhone";
// 3. 格式化
NSInteger ver = 6;
NSString *s4 = [[NSString alloc] initWithFormat:@"iPhone %ld", ver];
// 4. 便利構造器(自動釋放池)
NSString *s5 = [NSString string];
NSString *s6 = [NSString stringWithString:@"iOS"];
NSString *s7 = [NSString stringWithFormat:@"iOS %ld", ver];
常用操作
NSString *str = @"abcdpp123";
// 長度
NSUInteger len = str.length;
// 前綴/後綴判斷
BOOL hasPre = [str hasPrefix:@"abc"]; // YES
BOOL hasSuf = [str hasSuffix:@"123"]; // YES
// 子串截取
NSString *sub1 = [str substringToIndex:3]; // "abc"
NSString *sub2 = [str substringFromIndex:6]; // "123"
NSString *sub3 = [str substringWithRange:NSMakeRange(3,3)]; // "dpp"
// 拼接
NSString *cat1 = [sub1 stringByAppendingString:sub2]; // "abc123"
NSString *cat2 = [NSString stringWithFormat:@"%@%@", sub1, sub2];
// 替換
NSString *replaced = [@"NBANNN" stringByReplacingOccurrencesOfString:@"N" withString:@"C"]; // "CBACBA"
// 比較
NSString *a = [[NSString alloc] initWithFormat:@"NBA123"];
NSString *b = [[NSString alloc] initWithFormat:@"NBA123"];
[a isEqualToString:b]; // YES(內容比較)
a == b; // NO(指針比較,堆區不同對象)
// 數值轉換
@"123a456".intValue; // 123
@"123a456".integerValue; // 123
// 大小寫
@"ios".uppercaseString; // "IOS"
@"ios".capitalizedString; // "Ios"
@"IOS".lowercaseString; // "ios"
NSMutableString:可變字符串
NSMutableString *mStr = [NSMutableString stringWithCapacity:0];
// 追加
[mStr appendString:@"iPhone"];
[mStr appendFormat:@" %ld", 6]; // "iPhone 6"
// 插入
[mStr insertString:@" " atIndex:6]; // "iPhone 6" → "iPhone 6"
// 刪除
[mStr deleteCharactersInRange:NSMakeRange(0, 7)]; // 刪除 "iPhone " → "6"
// 替換範圍
[mStr replaceCharactersInRange:NSMakeRange(0, 1) withString:@"7"]; // "7"
// 實戰練習:文件名副名轉換
NSMutableString *fname = [NSMutableString stringWithString:@"藍鷗.png"];
if ([fname hasSuffix:@".png"]) {
[fname replaceCharactersInRange:NSMakeRange(fname.length-4, 4) withString:@".jpg"];
} else {
[fname appendString:@".jpg"];
}
// 結果:@"藍鷗.jpg"
關鍵區別總結
| 特性 | NSString | NSMutableString |
| 可變性 | 創建後不可修改 | 可原地修改內容 |
| 內存語義 | 複製多為引用計數+1 | 需显式 copy 得到不可變副本 |
| 性能 | 頻繁拼接產生大量中間對象 | 大量修改時效率高得多 |
| 線程安全 | 不可變天然線程安全 | 非線程安全,需自行加鎖 |
最佳實踐建議
- 默認使用
NSString,接口傳參、屬性聲明首選 copy 屬性;
- 大量拼接、逐字符構建時改用
NSMutableString;
- 利用
@"" 字面量簡化代碼,編譯期常量區唯一,極高效;
- 格式化字符串統一用
stringWithFormat:,類型安全且可讀性強。