MST

星途 面试题库

面试题:Objective-C中NSString与NSMutableString的性能差异及应用场景

阐述NSString和NSMutableString在内存管理、性能表现方面的差异,并且说明在什么样的业务场景下应该优先选择使用NSString,什么样的场景下优先选择NSMutableString,同时举例说明。
30.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

内存管理差异

  • NSString:是不可变字符串,一旦创建,其内容和长度就不能改变。每次对NSString进行修改操作(如拼接、替换等),实际上都会创建一个新的NSString对象,原对象的内存并不会被立即释放,而是遵循ARC(自动引用计数)或手动引用计数(MRC)的内存管理规则。例如:
NSString *str1 = @"Hello";
NSString *str2 = [str1 stringByAppendingString:@" World"];
// 这里str2是一个新创建的对象,str1的内存依然存在,直到其引用计数为0
  • NSMutableString:是可变字符串,可以在原有的字符串对象上进行修改操作,如插入、删除、替换字符等,不会创建新的对象(除非修改后内存不足需要重新分配内存)。在内存管理上,当对其进行修改操作时,会直接在原对象的内存空间上进行操作,如果修改后的字符串长度超出了原有的内存空间,系统会重新分配足够的内存。例如:
NSMutableString *mutableStr = [NSMutableString stringWithString:@"Hello"];
[mutableStr appendString:@" World"];
// mutableStr还是原来的对象,只是内容在原内存空间上被修改了

性能表现差异

  • NSString:由于每次修改操作都会创建新对象,所以在频繁修改字符串的场景下,会产生大量的临时对象,导致内存开销增大,性能下降。例如在一个循环中进行字符串拼接:
NSString *result = @"";
for (int i = 0; i < 1000; i++) {
    result = [result stringByAppendingFormat:@"%d", i];
}
// 这里会创建1000个新的NSString对象,性能较差
  • NSMutableString:因为可以在原对象上直接修改,避免了频繁创建新对象,在频繁修改字符串的场景下性能更优。同样是上述循环拼接字符串的场景:
NSMutableString *mutableResult = [NSMutableString string];
for (int i = 0; i < 1000; i++) {
    [mutableResult appendFormat:@"%d", i];
}
// 这里只使用一个NSMutableString对象,性能较好

业务场景选择

  • 优先选择NSString的场景
    • 当字符串内容不需要改变时,比如存储固定的文本信息,如网页标题、应用名称等。例如,在一个新闻应用中,新闻标题通常不会在运行时改变,此时使用NSString更合适:
NSString *newsTitle = @"今日重大新闻";
- 在需要保证字符串内容不可变的场景下,如作为字典的键值。因为字典的键需要是不可变对象,使用NSString能确保键值的稳定性。例如:
NSDictionary *dict = @{@"key": @"value"};
// 这里的@"key"就是NSString类型,保证了字典键的不可变性
  • 优先选择NSMutableString的场景
    • 当需要频繁对字符串进行修改操作时,如在文本编辑器应用中,用户不断输入、删除、修改文本内容,此时使用NSMutableString能提高性能。例如:
NSMutableString *editorText = [NSMutableString string];
// 用户输入操作模拟
[editorText appendString:@"用户输入的内容"];
// 用户删除操作模拟
[editorText deleteCharactersInRange:NSMakeRange(5, 3)];
- 在需要动态生成字符串的场景下,如日志记录,随着程序运行不断添加新的日志信息,NSMutableString更为适用。例如:
NSMutableString *logString = [NSMutableString string];
[logString appendString:@"程序启动"];
// 后续可以不断追加新的日志内容