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;