11.NSString與NSMutableString

參考自xx_cc的簡(jiǎn)書(shū)文章


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

NSString的本質(zhì)是一個(gè)類,最標(biāo)準(zhǔn)的創(chuàng)建NSString對(duì)象的方式如下:

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

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

NSString *str1 = @"rose";

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

NSString的恒定性

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

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

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

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

當(dāng)系統(tǒng)準(zhǔn)備要在內(nèi)存中創(chuàng)建字符串對(duì)象的時(shí)候,會(huì)先檢查內(nèi)存中是否有相同內(nèi)容的字符串對(duì)象,如果有,直接指向該內(nèi)存區(qū)域,如果沒(méi)有才會(huì)重新創(chuàng)建。

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

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

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

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

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

NSMutableString為可變字符串,無(wú)論修改多少次,對(duì)象始終只有一個(gè),每次修改字符串的時(shí)候不會(huì)再重新創(chuàng)建對(duì)象。NSMutableString繼承自NSString。

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

注意:不能直接初始化一個(gè)字符串常量給NSMutableString
例如:NSMutableString *str = @"xx_cc";因?yàn)锧"xx_cc"是一個(gè)父類對(duì)象,而str指針是一個(gè)子類指針,子類指針不能指向父類對(duì)象,當(dāng)調(diào)用str的子類獨(dú)有方法的時(shí)候就會(huì)出錯(cuò)。

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

需要多次使用一個(gè)固定的字符串的時(shí)盡量使用NSString,不會(huì)創(chuàng)建多余的重復(fù)的對(duì)象。而當(dāng)需要大量拼接字符串的時(shí)候,需要使用NSMutablString,保證每次拼接都是操作一個(gè)對(duì)象,不會(huì)重復(fù)創(chuàng)建多個(gè)對(duì)象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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