http://blog.csdn.net/a6472953/article/details/7943191
NSString是一個(gè)不可變的字符串對(duì)象。這不是表示這個(gè)對(duì)象聲明的變量的值不可變,而是表示它初始化以后,你不能改變?cè)撟兞克峙涞膬?nèi)存中的值,但你可以重新分配該變量所處的內(nèi)存空間。
而NSMutableString是可變的,意味著你可以追加它的內(nèi)存空間,或者修改它所分配的內(nèi)存空間中的值。
因?yàn)镹SMutableString和NSString的差別,所以他們之間的互相轉(zhuǎn)換使用使用合適的方法。 將NSMutableString轉(zhuǎn)換成NSString有下列幾種方法:
第一種,使用NSString stringWithString:方法
NSString *immutableString2 = [[yourMutableString copy] autorelease];
NSLog(@"immutableString2=%d,%d",immutableString2 ,yourMutableString);
第二種,使用NSMutableString copy方法
NSString *immutableString2 = [[yourMutableString copy] autorelease];
NSLog(@"immutableString2=%d,%d",immutableString2 ,yourMutableString);
第三種,使用(NSString *)類型強(qiáng)制轉(zhuǎn)換方法
NSString *immutableString3 = (NSString *)yourMutableString;
NSLog(@"immutableString3=%d,%d",immutableString3 ,yourMutableString);
第四種,使用NSString stringWithFormat:方法
NSString *immutableString4 = [NSString stringWithFormat:@"%@",yourMutableString];
NSLog(@"immutableString4=%d,%d",immutableString4 ,yourMutableString);
如果使用不當(dāng),將會(huì)出現(xiàn)這樣的錯(cuò)誤"Incompatible pointer types assigning NSMutableString to NSString"。</span>
這里涉及到兩個(gè)重要的概念:指針變量和實(shí)際對(duì)象
Immutable strings
// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;
// "Replace" the second string
str2 = @"Hello ikilimnik";
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
output:str1 = Hello World, str2 = Hello ikilimnik
Mutable strings
// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;
// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
注意,當(dāng)你使用不可變的NSString class時(shí),替換舊的字符串的唯一方式就是創(chuàng)建一個(gè)新的字符串然后更新你的變量“str2”
來(lái)指向這個(gè)新的字符串。這個(gè)操作不會(huì)影響“str1”所指向的內(nèi)容,因此它將繼續(xù)指向初始的字符串。
在NSMutableString的例子里,我們沒(méi)有創(chuàng)建第二個(gè)字符串,而是通過(guò)改變已經(jīng)存在的可變字符串“str2”的內(nèi)容來(lái)代替。
由于str1和str2兩個(gè)變量都仍然指向同一個(gè)字符串對(duì)象,從nslog中可以看到它們值都將會(huì)被更新。
理解指針變量和它實(shí)際指向?qū)ο蟮牟煌欠浅V匾?。一個(gè)NSString對(duì)象是不可變的,但是這并不阻止你改變指向這個(gè)不
可變對(duì)象的指針的值。
"NSString *"這個(gè)數(shù)據(jù)類型代表一個(gè)NSString對(duì)象的指針,不是NSString對(duì)象本身。
"NSMutableString *"這個(gè)數(shù)據(jù)類型則是代表"NSMutableString"對(duì)象本身,這兩者是有區(qū)別的。
這也是有的時(shí)候我們使用NSMutableString類型字符串時(shí),要使用copy的原因,因?yàn)榭赡懿幌敫淖冃碌淖址畷r(shí)影響到舊的字符串的值。
如:
NSMutableString * str2 = [str1 mutableCopy];
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}