OC語言-Foundation-NSString及NSMutableString剖析

NSString頭文件

NSString : NSObject
實現(xiàn)協(xié)議:
NSCopying/NSMutableCopying/NSSecureCoding
類別:
//擴(kuò)展類別
NSString (NSStringExtensionMethods)
//此API是用來檢測給定原始數(shù)據(jù)的字符串編碼
NSString (NSStringEncodingDetection)
NSMutableString : NSString
類別:
//可以實現(xiàn)子類的原始replaceCharactersInRange:范圍:方法
NSMutableString (NSMutableStringExtensionMethods)

NSString的C底層實現(xiàn)

AE66D63B-282B-46F7-A614-42FE18D4CFA4.png
6556218F-06C9-4A51-B11D-DC060D124A3C.png

可以看到,兩種聲明出來的isa是不同的.
第一種isa是__NSCFConstantString,內(nèi)存地址一樣.
第三種和其他objc對象類似的碾盟,在堆上分配內(nèi)存.

深拷貝和淺拷貝

先做個小測試

2CD0549E-7ABE-46B3-8773-1521F357C552.png

A471ACEC-2ECC-43FD-9DB4-6CB1A640F2C5.png

可以很明顯的看出來,我們進(jìn)行的copy操作為淺拷貝,兩個指針(str1和str2)指向的是同一塊內(nèi)存地址,
我們進(jìn)行的mutableCopy操作為深拷貝,指向的是兩塊存儲相同內(nèi)容的內(nèi)存地址.原因是mutableCopy操作是將其拷貝到堆上.引用計數(shù)加1.

下面我們分別測試NSString和NSMutableString
先看NSString

9C1E04F4-35DF-457D-B4E5-192AA88C00D4.png
DB81BF18-898D-4B79-A29B-44D651A37A44.png

@"123"存儲在文字常量區(qū),從上圖我們可以很清楚的看到
指針str1和指針str2指向同一內(nèi)存地址
當(dāng)str1改變內(nèi)容后,創(chuàng)建了新的對象,則str1指向另一塊內(nèi)存地址
將str1置為nil,完全不影響str2
所以,NSString為淺拷貝

再來測試NSMutableString

E9404A83-F4CC-49DB-AE4B-98CC4CAB3DF6.png
7A7316C4-7C06-4F1A-978B-CD7025BC05D7.png

從上圖我們可以看到
mutableStr1和mutableStr2雖然內(nèi)容相同,但指向的是不同的內(nèi)存地址
改變內(nèi)容后,仍然是指向自己的內(nèi)存地址
所以, NSMutableString為深拷貝

總結(jié)
淺拷貝:指針拷貝棚辽,指針與原指針地址相同,沒有創(chuàng)建新的對象冰肴。
深拷貝:內(nèi)容拷貝晚胡,創(chuàng)建了新的對象,指針地址與原對象的指針地址不同嚼沿。
1- 對一個NSString字符串進(jìn)行copy不會產(chǎn)生新對象(淺拷貝)
2- 對一個NSMutableString字符串進(jìn)行copy會產(chǎn)生新對象(深拷貝)
3- copy產(chǎn)生的新對象為NSString類型
4- mutableCopy產(chǎn)生的新對象為NSMutableString類型

接下來整理一下NSString和NSMutableString的常用方法

NSString常用

獲取字符串索引計數(shù)(可識別數(shù)字/字母/符號/空格,不可識別中文,顯示是亂碼)
- (unichar)characterAtIndex:(NSUInteger)index;
這個不知道是什么
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

NSString (NSStringExtensionMethods)常用

設(shè)置字符串內(nèi)容(全部大寫,全部小寫,首字母大寫)

@property (readonly, copy) NSString *uppercaseString;
@property (readonly, copy) NSString *lowercaseString;
@property (readonly, copy) NSString *capitalizedString;

字符串截取

以指定位置開始(包含指定位置的字符),包括之后的全部字符
- (NSString *)substringFromIndex:(NSUInteger)from;
從字符串的開頭一直截取到指定位置,但不包括該位置的字符
- (NSString *)substringToIndex:(NSUInteger)to;
按照所給出的位置,長度,從字符串截取子串
- (NSString *)substringWithRange:(NSRange)range;

字符串比較

compare方法(NSComparisonResult是定義的一個枚舉,完全一致為0,其余為其他(有1和-1))
字符串比較(必須完全一樣,大小寫不一致,有空格則均返回1)
- (NSComparisonResult)compare:(NSString *)string;
比較字符串是否完全相等
- (BOOL)isEqualToString:(NSString *)aString;
不考慮大小寫比較字符串,相同為0,不相同為其他
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
檢查字符串是否以另一字符串開頭(true為1,false為0)
- (BOOL)hasPrefix:(NSString *)str;
檢查字符串是否以另一字符串結(jié)尾(true為1,false為0)
- (BOOL)hasSuffix:(NSString *)str;

字符串查找(如果range.length長度大于0,證明有要查找的子串,否則證明沒有)

查找字符串某處是否包含其他字符串
- (NSRange)rangeOfString:(NSString *)searchString;
根據(jù)參數(shù)options的不同,按照不同的規(guī)則查找
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

字符串合并

字符串與字符串的合并
- (NSString *)stringByAppendingString:(NSString *)aString;
字符串與字符串或其它類型數(shù)據(jù)合并
- (NSString *)stringByAppendingFormat:(NSString *)format;
字符串格式化合并
(instancetype)stringWithFormat:(NSString *)format;

字符串替換

將字符串中的**全部替換成**
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
將某一位置的或者搜索出來的字符串替換成一個新的字符串
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;

字符串創(chuàng)建及賦值

創(chuàng)建字符串并賦值
(instancetype)initWithString:(NSString *)aString;
經(jīng)典的字符串賦值
(instancetype)string;
字符串賦值,參數(shù)只可寫一個字符串
(instancetype)stringWithString:(NSString *)string;

字符串寫入文件

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

從文件中讀取字符串,并經(jīng)過轉(zhuǎn)碼(保證讀出的中文不是亂碼)

+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

NSMutableString常用

字符串替換

將字符串中制定位置,長度的字符串替換成其他字符串
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;

NSMutableString (NSMutableStringExtensionMethods)常用

設(shè)置字符串內(nèi)容
- (void)setString:(NSString *)aString;
在指定位置插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末估盘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骡尽,更是在濱河造成了極大的恐慌遣妥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攀细,死亡現(xiàn)場離奇詭異箫踩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谭贪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門境钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俭识,你說我怎么就攤上這事慨削。” “怎么了套媚?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵缚态,是天一觀的道長。 經(jīng)常有香客問我堤瘤,道長玫芦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任本辐,我火速辦了婚禮桥帆,結(jié)果婚禮上医增,老公的妹妹穿的比我還像新娘。我一直安慰自己老虫,他們只是感情好调窍,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著张遭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪地梨。 梳的紋絲不亂的頭發(fā)上菊卷,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音宝剖,去河邊找鬼洁闰。 笑死,一個胖子當(dāng)著我的面吹牛万细,可吹牛的內(nèi)容都是我干的扑眉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赖钞,長吁一口氣:“原來是場噩夢啊……” “哼腰素!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雪营,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤弓千,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后献起,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洋访,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年谴餐,在試婚紗的時候發(fā)現(xiàn)自己被綠了姻政。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岂嗓,死狀恐怖汁展,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厌殉,我是刑警寧澤善镰,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站年枕,受9級特大地震影響炫欺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熏兄,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一品洛、第九天 我趴在偏房一處隱蔽的房頂上張望树姨。 院中可真熱鬧,春花似錦桥状、人聲如沸帽揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽转晰。三九已至,卻和暖如春士飒,著一層夾襖步出監(jiān)牢的瞬間查邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工酵幕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留扰藕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓芳撒,卻偏偏與公主長得像邓深,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笔刹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

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

  • 307芥备、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,547評論 0 1
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用舌菜,...
    LZM輪回閱讀 3,309評論 0 6
  • 第八天視頻課程: 認(rèn)識字符串 NSString NSString是一個Unicode編碼门躯、16位字符的字符序列。 ...
    Hysoka閱讀 357評論 0 1
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,716評論 0 4
  • 今天晚上媽媽打電話過來酷师,說姐姐15號回家讶凉,問能不能回來一下。我激動的留下了眼淚山孔,因為太久沒見到姐姐了懂讯,大概還是去年...
    語憶閱讀 187評論 1 0