標籤:tab cti 其他 search equal 字串格式化 res bsp end
一、NSString標頭檔
NSString : NSObject實現協議:NSCopying/NSMutableCopying/NSSecureCoding類別://擴充類別NSString (NSStringExtensionMethods)//此API是用來檢測給定未經處理資料的字串編碼NSString (NSStringEncodingDetection)
NSMutableString : NSString類別://可以實現子類的原始replaceCharactersInRange:範圍:方法NSMutableString (NSMutableStringExtensionMethods)
二、NSString的C底層實現
可以看到,兩種聲明出來的isa是不同的.
第一種isa是__NSCFConstantString,記憶體位址一樣.
第三種和其他objc對象類似的,在堆上分配記憶體.
三、深拷貝和淺拷貝
先做個小測試
可以很明顯的看出來,我們進行的copy操作為淺拷貝,兩個指標(str1和str2)指向的是同一塊記憶體位址,
我們進行的mutableCopy操作為深拷貝,指向的是兩Block Storage相同內容的記憶體位址.原因是mutableCopy操作是將其拷貝到堆上.引用計數加1.
下面我們分別測試NSString和NSMutableString
先看NSString
@"123"儲存在文字常量區,從我們可以很清楚的看到
指標str1和指標str2指向同一記憶體位址
當str1改變內容後,建立了新的對象,則str1指向另一塊記憶體位址
將str1置為nil,完全不影響str2
所以,NSString為淺拷貝
再來測試NSMutableString
從我們可以看到
mutableStr1和mutableStr2雖然內容相同,但指向的是不同的記憶體位址
改變內容後,仍然是指向自己的記憶體位址
所以, NSMutableString為深拷貝
總結淺拷貝:指標拷貝,指標與原指標地址相同,沒有建立新的對象。深拷貝:內容拷貝,建立了新的對象,指標地址與原對象的指標地址不同。1- 對一個NSString字串進行copy不會產生新對象(淺拷貝)2- 對一個NSMutableString字串進行copy會產生新對象(深拷貝)3- copy產生的新對象為NSString類型4- mutableCopy產生的新對象為NSMutableString類型
四、接下來整理一下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;
iOS基礎-NSString及NSMutableString剖析