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)
可以看到,兩種聲明出來的isa是不同的.
第一種isa是__NSCFConstantString,內(nèi)存地址一樣.
第三種和其他objc對象類似的碾盟,在堆上分配內(nèi)存.
深拷貝和淺拷貝
先做個小測試
可以很明顯的看出來,我們進(jìn)行的copy操作為淺拷貝,兩個指針(str1和str2)指向的是同一塊內(nèi)存地址,
我們進(jìn)行的mutableCopy操作為深拷貝,指向的是兩塊存儲相同內(nèi)容的內(nèi)存地址.原因是mutableCopy操作是將其拷貝到堆上.引用計數(shù)加1.
下面我們分別測試NSString和NSMutableString
先看NSString
@"123"存儲在文字常量區(qū),從上圖我們可以很清楚的看到
指針str1和指針str2指向同一內(nèi)存地址
當(dāng)str1改變內(nèi)容后,創(chuàng)建了新的對象,則str1指向另一塊內(nèi)存地址
將str1置為nil,完全不影響str2
所以,NSString為淺拷貝
再來測試NSMutableString
從上圖我們可以看到
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;