11.NSString與NSMutableString

參考自xx_cc的簡書文章


NSString創(chuàng)建與內(nèi)存存儲

NSString的本質(zhì)是一個類,最標準的創(chuàng)建NSString對象的方式如下:

NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];

使用這種方式創(chuàng)建的字符串是一個空的字符@""
OC提供了一種更為快速的創(chuàng)建字符串對象的方式:使用前綴@

NSString *str1 = @"rose";

@"rose"本質(zhì)上是一個NSString對象,這個對象中存儲的是字符串"rose"环揽。將這個字符串對象的地址返回賦值給str1指針卷仑。

NSString的恒定性

使用@快速創(chuàng)建字符串對象的時候,這個字符串對象是存儲在常量區(qū)(數(shù)據(jù)段) 的。
當(dāng)我們調(diào)用NSString的類方法來創(chuàng)建對象的時候.創(chuàng)建的字符串對象是存儲在堆區(qū)留夜。

NSString *str = @"jack";
NSString *str1 = [NSString new];
NSLog(@"str:%p",str);  // str:0x100001040
NSLog(@"str1:%p",str1);  // str1:0x7fff97f512e8

重新為字符串指針初始化值的時候,會創(chuàng)建一個字符串對象并將這個字符串對象的地址重新賦值給字符串指針變量。

NSString *str1 = @"jack";
NSLog(@"str1:%p",str1);  // str1:0x100001038
str1 = @"rose";
NSLog(@"str1:%p",str1);  // str1:0x100001078

當(dāng)系統(tǒng)準備要在內(nèi)存中創(chuàng)建字符串對象的時候蜕衡,會先檢查內(nèi)存中是否有相同內(nèi)容的字符串對象,如果有设拟,直接指向該內(nèi)存區(qū)域慨仿,如果沒有才會重新創(chuàng)建。

NSString *str1 = @"jack";
NSLog(@"str1:%p",str1);  // str1:0x100001038
str1 = nil;
NSString *str2 = @"jack";
NSLog(@"str2:%p",str2);  // str1:0x100001038

注意:存儲在常量區(qū)的數(shù)據(jù)不會被回收. 所以存儲在常量區(qū)的字符串對象也不會被回收.

NSString類的常用方法
  1. 使用拼接的方式創(chuàng)建1個NSString對象
    + (instancetype)stringWithFormat:(NSString *)format, ...
  2. 獲取字符串的長度
    @property (readonly) NSUInteger length;
  3. 得到字符串中指定下標的字符纳胧,返回值是unichar類型,打印使用%C
    - (unichar)characterAtIndex:(NSUInteger)index;
  4. 判斷當(dāng)前字符串對象和傳入的字符串對象的內(nèi)容是否相同
    - (BOOL)isEqualToString:(NSString *)aString;
    注意:不可以使用==來判斷兩個OC字符串的內(nèi)容是否相同镰吆, ==運算符的作用: 比較左右兩邊的數(shù)據(jù)是否相同,如果兩邊都是指針變量跑慕,那么比較的是指針變量的值也就是地址万皿。
  5. 將C語言的字符串轉(zhuǎn)換為OC字符串對象
    + (instancetype)stringWithUTF8String:(NSString *)string;
  6. 將OC字符串對象轉(zhuǎn)換為C語言的字符串
    @property (nullable, readonly) __strong const char *UTF8String
  7. 將字符串寫入到指定的文件中
    - (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
  8. 將文件中的內(nèi)容讀取到字符串中
    + (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
  9. 使用NSURL讀寫資源,字符串提供了對應(yīng)的方法去讀寫NSURL對象中封裝的資源路徑
//從指定資源路徑讀取文本內(nèi)容
 + (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//將字符串的內(nèi)容寫入到資源路徑中
  - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
// 如果要向網(wǎng)頁或者ftp寫內(nèi)容要有權(quán)限

10.字符串比較
- (NSComparisonResult)compare:(NSString *)string;
11.字符串比較:附加條件的比較
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;

  1. 判斷字符串是否以指定的字符串開頭
    - (BOOL)hasPrefix:(NSString *)str;
  2. 判斷字符串是否以指定的字符串結(jié)尾
    - (BOOL)hasSuffix:(NSString *)str;
    14.在字符串中搜索字符串
    - (NSRange)rangeOfString:(NSString *)searchString;
  3. 從指定的下標出一直截取到最后
    - (NSString *)substringFromIndex:(NSUInteger)from;
  4. 從第0個開始截取指定的個數(shù)
    - (NSString *)substringToIndex:(NSUInteger)to;
  5. 截取指定的一段范圍
    - (NSString *)substringWithRange:(NSRange)range;
  6. 字符串替換
    - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
    19.將轉(zhuǎn)換字符串大小寫
    @property (readonly, copy) NSString *uppercaseString; // 轉(zhuǎn)換為大寫
    @property (readonly, copy) NSString *lowercaseString; // 換換為小寫
NSMutableString的初始化

NSMutableString為可變字符串,無論修改多少次相寇,對象始終只有一個慰于,每次修改字符串的時候不會再重新創(chuàng)建對象。NSMutableString繼承自NSString唤衫。

NSMutableString *str1 = [[NSMutableString alloc]init];
NSMutableString *str2 = [NSMutableString string];

注意:不能直接初始化一個字符串常量給NSMutableString
例如:NSMutableString *str = @"xx_cc";因為@"xx_cc"是一個父類對象,而str指針是一個子類指針绵脯,子類指針不能指向父類對象佳励,當(dāng)調(diào)用str的子類獨有方法的時候就會出錯。

NSMutableString的常用方法
  1. 追加新的字符串
    - (void)appendString:(NSString *)aString;
    - (void)appendFormat:(NSString *)format, ... ;
  2. NSMutableString轉(zhuǎn)化為NSString蛆挫,轉(zhuǎn)化后就具備了恒定性
    + (instancetype)stringWithString:(NSString *)string;
NSString與NSMutableString的使用場景

需要多次使用一個固定的字符串的時盡量使用NSString赃承,不會創(chuàng)建多余的重復(fù)的對象。而當(dāng)需要大量拼接字符串的時候悴侵,需要使用NSMutablString瞧剖,保證每次拼接都是操作一個對象,不會重復(fù)創(chuàng)建多個對象可免。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抓于,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浇借,更是在濱河造成了極大的恐慌捉撮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妇垢,死亡現(xiàn)場離奇詭異巾遭,居然都是意外死亡,警方通過查閱死者的電腦和手機闯估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門灼舍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涨薪,你說我怎么就攤上這事骑素。” “怎么了尤辱?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵砂豌,是天一觀的道長。 經(jīng)常有香客問我光督,道長阳距,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任结借,我火速辦了婚禮筐摘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己咖熟,他們只是感情好圃酵,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馍管,像睡著了一般郭赐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上确沸,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天捌锭,我揣著相機與錄音,去河邊找鬼罗捎。 笑死观谦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桨菜。 我是一名探鬼主播豁状,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倒得!你這毒婦竟也來了泻红?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屎暇,失蹤者是張志新(化名)和其女友劉穎承桥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體根悼,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡凶异,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挤巡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剩彬。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矿卑,靈堂內(nèi)的尸體忽然破棺而出喉恋,到底是詐尸還是另有隱情,我是刑警寧澤母廷,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布轻黑,位于F島的核電站,受9級特大地震影響琴昆,放射性物質(zhì)發(fā)生泄漏氓鄙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一业舍、第九天 我趴在偏房一處隱蔽的房頂上張望抖拦。 院中可真熱鬧升酣,春花似錦、人聲如沸态罪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽复颈。三九已至绩聘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間券膀,已是汗流浹背君纫。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芹彬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓叉庐,卻偏偏與公主長得像舒帮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陡叠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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