前言
有些初學(xué)者不太明白NSString和NSMutableString的區(qū)別,抑或是有著幾年開發(fā)經(jīng)驗(yàn)的老司機(jī)也只是會用萍聊,并沒有特別在意它們之間的區(qū)別,但是面試的時候可能就會問到悦析,下面我們就實(shí)際例子說明它們之間的區(qū)別寿桨。
NSString
例1:
NSString *str1 = @"張三";
NSLog(@"p1===============%p",str1);
str1 = @"李四";
NSLog(@"p2===============%p",str1);
輸出結(jié)果
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);
輸出結(jié)果
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前后分別指向不同的內(nèi)存地址,例2中剛開始str1和str2同時指向@"張三"內(nèi)存地址强戴,后面str2指向了@"李四"亭螟,str1沒有變∑锎酰可以看出NSString *這種指針變量不變的是指針指向的內(nèi)容预烙,也即地址中的內(nèi)容,可以改變的是指針的指向陵刹,也即是可以改變地址默伍。
NSMutableString
例3:
NSMutableString *str3 = [NSMutableString stringWithString:@"熊大"];
NSLog(@"p6===============%p",str3);
[str3 setString:@"熊二"];
NSLog(@"p7===============%p",str3);
輸出結(jié)果
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);
輸出結(jié)果
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前后指向相同的內(nèi)存地址,例4中str3和str4始終也指向相同的內(nèi)存地址衰琐∫埠可以看出NSMutableString *這種指針變量改變的是指針指向的內(nèi)容,也即地址中的內(nèi)容羡宙,不變的是指針的指向狸剃,也即是不改變地址。
結(jié)論
- NSString *指針變量指向的對象內(nèi)容不可變狗热,
- NSMutableString *指針變量指向的對象內(nèi)容可以改變钞馁。
- 這里的可變不可變指的是地址里面的內(nèi)容可變不可變。
- NSMutableString可以避免頻繁操作字符串(比如拼接匿刮、截取等)創(chuàng)造出新的字符串引起性能問題