NSString和NSMutableString的区别

前言

有些初学者不太明白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可以避免频繁操作字符串(比如拼接、截取等)创造出新的字符串引起性能问题

你可能感兴趣的:(NSString和NSMutableString的区别)