iOS NSString和NSMutableString

一、 NSString

Github 傳送門

  1. NSString被定義為類,是一個引用類型,
  2. 初始化方法:字面量初始化筛谚,內(nèi)存分配搭配初始化器,工廠方法;
  3. NSString擁有恒定性停忿,所有的操作無法更改字符串本身驾讲,如有更改都是返回新值的形式
  4. NSString擁有共享機制,在運行時的時候?qū)碛邢嗤址膕tring指向同一個指針(只有通過字面量初始化的string)

代碼演示

1.初始化

//----------------NSString初始化-------------
NSString *str1 = @"Hello World!";//字面量初始化
NSString *str2 = [[NSString alloc]initWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//內(nèi)存分配搭配初始化器
NSString *str3 = [NSString stringWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//工廠方法
NSString *str4 = @"Hello World!";

2.共享機制

1)代碼

//---------共享機制------        
NSLog(@"str1 = %@",str1);
NSLog(@"str2 = %@",str2);
NSLog(@"str3 = %@",str3);
NSLog(@"str4 = %@",str4);

NSLog(@"str1 = %p",str1);
NSLog(@"str2 = %p",str2);
NSLog(@"str3 = %p",str3);
NSLog(@"str4 = %p",str4);
    

2)打印出四個字符串的內(nèi)存地址如下

image1.png

從上圖中可以看出

  • 四個字符串擁有相同的內(nèi)容席赂,但是str1和str4的指針相同蝎毡。運行時會將擁有相同字符串的string指向同一個指針(只有通過字面量初始化的string)

3.恒定性

1)代碼(接著上面的代碼)

NSLog(@"----------------------------分割線----------------------------");
NSLog(@"str1.p = %p",str1);
[str1 stringByAppendingString:@" Jixin"];
NSLog(@"str1 = %@",str1);
NSLog(@"str1.p = %p",str1);
NSLog(@"");
str1 = [str1 stringByAppendingString:@" Jixin"];
NSLog(@"str1 = %@",str1);
NSLog(@"str1.p = %p",str1);
  1. 打印出結(jié)果如下
image2.png

從上圖中可以看出

  • 在執(zhí)行了[str1 stringByAppendingString:@" Jixin"];后str1的值和指針都沒有改變;
  • 但是在執(zhí)行了str1 = [str1 stringByAppendingString:@" Jixin"];后str1的值和指針均改變了氧枣。
  • 這說明對NSString的操作無法更改字符串本身沐兵,其實是返回的一個新的NSString。

二便监、NSMutableString

  1. NSMutableString具有可變性扎谎,NSString具有恒定性;
  2. NSMutableString為NSString的子類烧董;
  3. NSMutableString不具有共享機制毁靶,NSString具有共享機制;
  4. NSMutableString并不是在原有內(nèi)存上直接增長逊移,而是重新分配一個更大或更小的緩存容量存放字符预吆。

代碼演示

1.初始化

NSLog(@"----------------------------分割線----------------------------");
NSMutableString *mustr1 = [NSMutableString stringWithString: @"Hello,World!"];
NSLog(@"mustr1.p = %p",mustr1);

NSMutableString *mustr2 = [NSMutableString stringWithString: @"Hello,World!"];
NSLog(@"mustr2.p = %p",mustr2);

[mustr1 appendString:@" Very Good!"];
NSLog(@"mustr1 = %@",mustr1);
NSLog(@"mustr1.p = %p",mustr1);

2.NSMutableString不具有共享機制,不具有恒定性

  1. 打印出得結(jié)果如下

image3.png

從上圖中可以看出

  • 雖然mustr1和mustr2擁有相同的文字胳泉,但是指針卻不相同拐叉;
  • [mustr1 appendString:@" Very Good!"];可以直接修改NSMutableString的內(nèi)容,不具有恒定性扇商。

三凤瘦、NSString,NSMutableString的copy和mutableCopy

There are two kinds of object copying: shallow copies and deep copies.

1. NSString

  1. 代碼
NSLog(@"----------------------------分割線----------------------------");
NSString *string = @"Good to see you";
NSLog(@" string.p = %p",string);

NSString *strCopy = [string copy];
NSString *strMCopy = [string mutableCopy];
NSLog(@" strCopy.p = %p",strCopy);
NSLog(@"strMCopy.p = %p",strMCopy);
NSLog(@"");
NSLog(@" strCopy = %@",strCopy);
NSLog(@"strMCopy = %@",strMCopy);
  1. 打印結(jié)果

image4.png

從上圖可看出

  • 對NSString執(zhí)行copy的時候是指針賦值案铺,屬于淺拷貝(指針相同)蔬芥;
  • 對NSString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)。

2. NSMutableString

  1. 代碼
NSLog(@"----------------------------分割線----------------------------");
NSMutableString *mStr = [NSMutableString stringWithString:@"Good day"];
NSLog(@"    mStr.p = %p",mStr);
NSString *strCopy = [mStr copy];
NSString *strMCopy = [mStr mutableCopy];
NSLog(@" strCopy.p = %p",strCopy);
NSLog(@"strMCopy.p = %p",strMCopy);
NSLog(@"");
NSMutableString *mStrCopy = [mStr copy];
NSMutableString *mStrMCopy = [mStr mutableCopy];
NSLog(@" mStrCopy.p = %p",mStrCopy);
NSLog(@"mStrMCopy.p = %p",mStrMCopy);

  1. 打印結(jié)果

image5.png

從上圖可看出

  • 對NSMutableString執(zhí)行copy的時候是內(nèi)容復(fù)制笔诵,屬于深拷貝(指針不同)返吻;
  • 對NSMutableString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)乎婿。

3.copy和mutableCopy的結(jié)論如下

  • 對NSString執(zhí)行copy的時候是指針賦值测僵,屬于淺拷貝(指針相同);
  • 對NSString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制次酌,屬于深拷貝(指針不同)恨课。
  • 對NSMutableString執(zhí)行copy的時候是內(nèi)容復(fù)制舆乔,屬于深拷貝(指針不同)岳服;
  • 對NSMutableString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)希俩。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吊宋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颜武,更是在濱河造成了極大的恐慌璃搜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞上,死亡現(xiàn)場離奇詭異这吻,居然都是意外死亡,警方通過查閱死者的電腦和手機篙议,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門唾糯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鬼贱,你說我怎么就攤上這事移怯。” “怎么了这难?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵舟误,是天一觀的道長。 經(jīng)常有香客問我姻乓,道長嵌溢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任蹋岩,我火速辦了婚禮堵腹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘星澳。我一直安慰自己疚顷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腿堤,像睡著了一般阀坏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笆檀,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天忌堂,我揣著相機與錄音,去河邊找鬼酗洒。 笑死士修,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的樱衷。 我是一名探鬼主播棋嘲,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矩桂!你這毒婦竟也來了沸移?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侄榴,失蹤者是張志新(化名)和其女友劉穎雹锣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癞蚕,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蕊爵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桦山。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攒射。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖度苔,靈堂內(nèi)的尸體忽然破棺而出匆篓,到底是詐尸還是另有隱情,我是刑警寧澤寇窑,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布鸦概,位于F島的核電站,受9級特大地震影響甩骏,放射性物質(zhì)發(fā)生泄漏窗市。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一饮笛、第九天 我趴在偏房一處隱蔽的房頂上張望咨察。 院中可真熱鬧,春花似錦福青、人聲如沸摄狱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媒役。三九已至祝谚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酣衷,已是汗流浹背交惯。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穿仪,地道東北人席爽。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像啊片,于是被迫代替她去往敵國和親只锻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容