面试题答案
一键面试1. NSString 和 NSMutableString 的主要区别
- 不可变性:
- NSString:是不可变字符串,一旦创建,其值就不能被改变。每次对 NSString 进行操作(如拼接、替换等)都会返回一个新的 NSString 对象。例如:
NSString *str1 = @"Hello";
NSString *str2 = [str1 stringByAppendingString:@" World"];
// str1 本身并未改变,str2 是一个新创建的字符串对象
- **NSMutableString**:是可变字符串,可以在原字符串的基础上进行修改操作,不会创建新的对象。例如:
NSMutableString *mutableStr = [NSMutableString stringWithString:@"Hello"];
[mutableStr appendString:@" World"];
// mutableStr 自身的值被修改
- 内存管理:
- NSString:由于其不可变性,适合用于存储那些值不会改变的数据,并且系统可以对相同内容的 NSString 对象进行优化,共享内存。
- NSMutableString:因为其内容可变,在修改时可能会导致内存重新分配,特别是当字符串长度变化较大时,需要更多的内存管理操作。
2. 大量字符串拼接时的优化
- 使用 NSMutableString: 在有大量字符串需要拼接的情况下,应该优先使用 NSMutableString 进行拼接。因为每次使用 NSString 进行拼接操作都会创建新的对象,这会导致大量的内存开销和性能损耗。而 NSMutableString 可以在原字符串上直接修改,避免了频繁创建新对象的开销。例如:
NSMutableString *result = [NSMutableString string];
NSArray *stringsToAppend = @[@"string1", @"string2", @"string3", /* 更多字符串 */];
for (NSString *str in stringsToAppend) {
[result appendString:str];
}
- 避免在循环中使用 NSString 拼接:
如果在循环中使用 NSString 拼接,如
NSString *newStr = [oldStr stringByAppendingString:anotherStr];
,每循环一次都会创建一个新的 NSString 对象,随着循环次数增加,内存开销和性能损耗会急剧上升。例如:
// 不推荐的做法
NSString *concatenated = @"";
for (int i = 0; i < 1000; i++) {
concatenated = [concatenated stringByAppendingFormat:@"%d", i];
}
这种做法会创建 1000 个新的 NSString 对象,性能很差。
综上所述,在大量字符串拼接场景下,NSMutableString 是更优的选择,可以显著提升性能和减少内存开销。