iOS基礎-NSString及NSMutableString剖析

1、NSString頭文件api

NSString : NSObject
實現協議:
NSCopying/NSMutableCopying/NSSecureCoding
類別:
//擴展類別
NSString (NSStringExtensionMethods)
//此API是用來檢測給定原始數據的字符串編碼
NSString (NSStringEncodingDetection)
NSMutableString : NSString
類別:
//能夠實現子類的原始replaceCharactersInRange:範圍:方法
NSMutableString (NSMutableStringExtensionMethods)

2、NSString的C底層實現app

能夠看到,兩種聲明出來的isa是不一樣的.
第一種isa是__NSCFConstantString,內存地址同樣.
第三種和其餘objc對象相似的,在堆上分配內存.測試

3、深拷貝和淺拷貝編碼

先作個小測試atom

 

 

能夠很明顯的看出來,咱們進行的copy操做爲淺拷貝,兩個指針(str1和str2)指向的是同一塊內存地址,spa

咱們進行的mutableCopy操做爲深拷貝,指向的是兩塊存儲相同內容的內存地址.緣由是mutableCopy操做是將其拷貝到堆上.引用計數加1.指針

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



@"123"存儲在文字常量區,從上圖咱們能夠很清楚的看到
指針str1和指針str2指向同一內存地址
當str1改變內容後,建立了新的對象,則str1指向另外一塊內存地址
將str1置爲nil,徹底不影響str2
因此,NSString爲淺拷貝orm

再來測試NSMutableString對象



從上圖咱們能夠看到
mutableStr1和mutableStr2雖然內容相同,但指向的是不一樣的內存地址
改變內容後,仍然是指向本身的內存地址
因此, NSMutableString爲深拷貝

總結
淺拷貝:指針拷貝,指針與原指針地址相同,沒有建立新的對象。
深拷貝:內容拷貝,建立了新的對象,指針地址與原對象的指針地址不一樣。
1- 對一個NSString字符串進行copy不會產生新對象(淺拷貝)
2- 對一個NSMutableString字符串進行copy會產生新對象(深拷貝)
3- copy產生的新對象爲NSString類型
4- mutableCopy產生的新對象爲NSMutableString類型

4、接下來整理一下NSString和NSMutableString的經常使用方法

NSString經常使用

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

NSString (NSStringExtensionMethods)經常使用

設置字符串內容(所有大寫,所有小寫,首字母大寫)

@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;
檢查字符串是否以另外一字符串結尾(true爲1,false爲0)
- (BOOL)hasSuffix:(NSString *)str;

字符串查找(若是range.length長度大於0,證實有要查找的子串,不然證實沒有)

查找字符串某處是否包含其餘字符串
- (NSRange)rangeOfString:(NSString *)searchString;
根據參數options的不一樣,按照不一樣的規則查找
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

字符串合併

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

字符串替換

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

字符串建立及賦值

建立字符串並賦值
(instancetype)initWithString:(NSString *)aString;
經典的字符串賦值
(instancetype)string;
字符串賦值,參數只可寫一個字符串
(instancetype)stringWithString:(NSString *)string;

字符串寫入文件

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

從文件中讀取字符串,並通過轉碼(保證讀出的中文不是亂碼)

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

 NSMutableString經常使用

字符串替換

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

NSMutableString (NSMutableStringExtensionMethods)經常使用

設置字符串內容
- (void)setString:(NSString *)aString;
在指定位置插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format;
相關文章
相關標籤/搜索