前言
有些初学者不太明白NSString和NSMutableString的区别,抑或是有着几年开发经验的老司机也只是会用,并没有特别在意它们之间的区别,但是面试的时候可能就会问到,下面我们就实际例子说明它们之间的区别。
NSString
例1:
NSString *str1 = @"张三";
NSLog(@"p1===============%p",str1);
str1 = @"李四";
NSLog(@"p2===============%p",str1);
输出结果
2019-06-16 11:44:48.749016+0800 Test[92844:2722351] p1===============0x10c9be0b8
2019-06-16 11:44:48.749079+0800 Test[92844:2722351] p2===============0x10c9be0f8
例2:
NSString *str1 = @"张三";
NSString *str2 = str1;
NSLog(@"p3===============%p",str1);
NSLog(@"p4===============%p",str2);
str2 = @"李四";
NSLog(@"p5===============%p",str2);
NSLog(@"str1 = %@,str2 = %@",str1,str2);
输出结果
2019-06-16 11:49:37.922460+0800 Test[92904:2725082] p3===============0x10a6980b8
2019-06-16 11:49:37.922529+0800 Test[92904:2725082] p4===============0x10a6980b8
2019-06-16 11:49:37.922591+0800 Test[92904:2725082] p5===============0x10a698118
2019-06-16 11:49:37.922662+0800 Test[92904:2725082] str1 = 张三,str2 = 李四
分析:例1中str1前后分别指向不同的内存地址,例2中刚开始str1和str2同时指向@"张三"内存地址,后面str2指向了@"李四",str1没有变。可以看出NSString *这种指针变量不变的是指针指向的内容,也即地址中的内容,可以改变的是指针的指向,也即是可以改变地址。
NSMutableString
例3:
NSMutableString *str3 = [NSMutableString stringWithString:@"熊大"];
NSLog(@"p6===============%p",str3);
[str3 setString:@"熊二"];
NSLog(@"p7===============%p",str3);
输出结果
2019-06-16 12:15:10.410115+0800 Test[93089:2737934] p6===============0x600003f56910
2019-06-16 12:15:10.410187+0800 Test[93089:2737934] p7===============0x600003f56910
例4:
NSMutableString *str3 = [NSMutableString stringWithString:@"熊大"];
NSMutableString *str4 = str3;
NSLog(@"p8===============%p",str3);
NSLog(@"p9===============%p",str4);
[str4 setString:@"熊二"];
NSLog(@"p10===============%p",str4);
NSLog(@"str3 = %@,str4 = %@",str3,str4);
输出结果
2019-06-16 12:19:14.085067+0800 Test[93135:2740470] p8===============0x600002d00060
2019-06-16 12:19:14.085134+0800 Test[93135:2740470] p9===============0x600002d00060
2019-06-16 12:19:14.085206+0800 Test[93135:2740470] p10===============0x600002d00060
2019-06-16 12:19:14.085290+0800 Test[93135:2740470] str3 = 熊二,str4 = 熊二
分析:例3中str3前后指向相同的内存地址,例4中str3和str4始终也指向相同的内存地址。可以看出NSMutableString *这种指针变量改变的是指针指向的内容,也即地址中的内容,不变的是指针的指向,也即是不改变地址。
结论
- NSString *指针变量指向的对象内容不可变,
- NSMutableString *指针变量指向的对象内容可以改变。
- 这里的可变不可变指的是地址里面的内容可变不可变。
- NSMutableString可以避免频繁操作字符串(比如拼接、截取等)创造出新的字符串引起性能问题