一、NSString是一個(gè)不可變的字符串對象。這不是表示這個(gè)對象聲明的變量的值不可變,而是表示它初始化以后,你不能改變該變量所分配的內(nèi)存中的值,但你可以重新分配該變量所處的內(nèi)存空間。而NSMutableString是可變的,意味著你可以追加它的內(nèi)存空間,或者修改它所分配的內(nèi)存空間中的值。
二、NSMutable是NSString的子類,繼承上述NSString的方法和屬性。
但是不同點(diǎn)是;NSString在內(nèi)存中的大小的地址是不變的,重新復(fù)制時(shí),其實(shí)是開辟另外一塊內(nèi)存地址分配給NSString。是不可變的。
NSMutableString可以在原先分配的內(nèi)存的基礎(chǔ)上通過增減內(nèi)存的方式來改變自己。是可變的。
三、注意,當(dāng)你使用不可變的NSString class時(shí),替換舊的字符串的唯一方式就是創(chuàng)建一個(gè)新的字符串然后更新你的變量“str2”來指向這個(gè)新的字符串。這個(gè)操作不會(huì)影響“str1”所指向的內(nèi)容,因此它將繼續(xù)指向初始的字符串。
在NSMutableString的例子里,我們沒有創(chuàng)建第二個(gè)字符串,而是通過改變已經(jīng)存在的可變字符串“str2”的內(nèi)容來代替。
由于str1和str2兩個(gè)變量都仍然指向同一個(gè)字符串對象,從nslog中可以看到它們值都將會(huì)被更新。
理解指針變量和它實(shí)際指向?qū)ο蟮牟煌欠浅V匾?。一個(gè)NSString對象是不可變的,但是這并不阻止你改變指向這個(gè)不
可變對象的指針的值。
"NSString *"這個(gè)數(shù)據(jù)類型代表一個(gè)NSString對象的指針,不是NSString對象本身。
"NSMutableString *"這個(gè)數(shù)據(jù)類型則是代表"NSMutableString"對象本身,這兩者是有區(qū)別的。
這也是有的時(shí)候我們使用NSMutableString類型字符串時(shí),要使用copy的原因,因?yàn)榭赡懿幌敫淖冃碌淖址畷r(shí)影響到舊的字符串的值。