String与NSMutableString、NSString的核心区别分别是什么
iOS 开发场景下字符串类型差异专业解答
String 与 NSMutableString 的核心区别
- 类型归属与语义:
String是 Swift 标准库原生实现的值类型(Value Type),不继承自NSObject;NSMutableString是 Foundation 框架提供的引用类型(Reference Type),是NSString的可变子类,完全遵循 Objective-C 对象模型,继承自NSObject。 - 可变性实现逻辑:
String没有独立的可变/不可变变体,通过声明为var/let控制可变性,底层通过 Copy-on-Write(写时复制,COW) 机制优化性能:声明为let时内容完全不可修改,声明为var做修改操作时,仅当实例存在多个持有者才会触发实际内存拷贝,无多余性能开销;NSMutableString是显式可变类,实例初始化后支持原地完成拼接、替换、删除、插入等字符串修改操作,没有编译级别的不可变约束。 - 传递与内存行为:
String作为值类型,赋值、函数传参时传递的是逻辑独立的拷贝(受COW优化,无多持有者时不会产生实际拷贝),不存在跨作用域共享修改的副作用;NSMutableString作为引用类型,赋值、传参时传递的是对象指针,多个变量指向同一实例时,通过任意一个变量修改实例内容都会同步影响所有持有者。 - 性能与使用建议:
String桥接为NSMutableString时会产生额外的拷贝开销,Swift 开发场景下需要可变字符串时,直接将原生String声明为var的性能、安全性均优于桥接使用NSMutableString;仅在需要调用仅支持NSMutableString的 legacy Objective-C API 时才推荐做桥接转换。
String 与 NSString 的核心区别
- 类型与编码底层:
String是 Swift 原生值类型,基于 Unicode 标准实现,原生支持扩展字形簇(Extended Grapheme Clusters) 处理,适配 Swift 泛型、协议扩展、值语义等全部现代语言特性;NSString是 Foundation 框架提供的引用类型,基于 UTF-16 编码单元实现,是 Objective-C 生态的核心字符串类型,仅适配NSObject协议体系。 - 可变性模型:
String通过var/let声明即可控制可变性,COW机制保障修改时的值语义,无需单独的可变子类;NSString本身是不可变类,实例初始化后长度、字符内容完全不可修改,可变操作必须使用其子类NSMutableString。 - 索引与字符遍历逻辑:
String使用专属的String.Index作为索引类型,不支持直接通过Int类型整数下标访问指定位置字符,默认遍历以用户可见的Character(即扩展字形簇)为单位,对多码位emoji、带重音的组合字符等场景的计数、遍历符合用户直觉;NSString以 UTF-16 编码单元为索引基准,支持整数下标访问,其length属性返回的是字符串包含的 UTF-16 编码单元数量,而非用户可见的实际字符数,处理特殊 Unicode 字符时容易出现索引越界、字符截断问题。 - 互操作特性:二者支持 toll-free bridged 无缝桥接,Swift 代码中可以直接将
String桥接为NSString调用 Foundation 层API,多数场景下桥接零开销;NSString转换为 Swift 原生String时会自动适配 Swift 的字符处理逻辑,纯 Swift 场景下优先使用String可避免反复桥接的额外开销,也能规避NSString索引逻辑带来的潜在bug。
内容的提问来源于stack exchange,提问作者user10595407
相关产品推荐
相关产品推荐

