參考自xx_cc的簡書文章
NSString創(chuàng)建與內(nèi)存存儲
NSString的本質(zhì)是一個類,最標準的創(chuàng)建NSString對象的方式如下:
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
使用這種方式創(chuàng)建的字符串是一個空的字符@""
OC提供了一種更為快速的創(chuàng)建字符串對象的方式:使用前綴@
NSString *str1 = @"rose";
@"rose"本質(zhì)上是一個NSString對象,這個對象中存儲的是字符串"rose"环揽。將這個字符串對象的地址返回賦值給str1指針卷仑。
NSString的恒定性
使用@快速創(chuàng)建字符串對象的時候,這個字符串對象是存儲在常量區(qū)(數(shù)據(jù)段) 的。
當(dāng)我們調(diào)用NSString的類方法來創(chuàng)建對象的時候.創(chuàng)建的字符串對象是存儲在堆區(qū)留夜。
NSString *str = @"jack";
NSString *str1 = [NSString new];
NSLog(@"str:%p",str); // str:0x100001040
NSLog(@"str1:%p",str1); // str1:0x7fff97f512e8
重新為字符串指針初始化值的時候,會創(chuàng)建一個字符串對象并將這個字符串對象的地址重新賦值給字符串指針變量。
NSString *str1 = @"jack";
NSLog(@"str1:%p",str1); // str1:0x100001038
str1 = @"rose";
NSLog(@"str1:%p",str1); // str1:0x100001078
當(dāng)系統(tǒng)準備要在內(nèi)存中創(chuàng)建字符串對象的時候蜕衡,會先檢查內(nèi)存中是否有相同內(nèi)容的字符串對象,如果有设拟,直接指向該內(nèi)存區(qū)域慨仿,如果沒有才會重新創(chuàng)建。
NSString *str1 = @"jack";
NSLog(@"str1:%p",str1); // str1:0x100001038
str1 = nil;
NSString *str2 = @"jack";
NSLog(@"str2:%p",str2); // str1:0x100001038
注意:存儲在常量區(qū)的數(shù)據(jù)不會被回收. 所以存儲在常量區(qū)的字符串對象也不會被回收.
NSString類的常用方法
- 使用拼接的方式創(chuàng)建1個NSString對象
+ (instancetype)stringWithFormat:(NSString *)format, ...
- 獲取字符串的長度
@property (readonly) NSUInteger length;
- 得到字符串中指定下標的字符纳胧,返回值是unichar類型,打印使用%C
- (unichar)characterAtIndex:(NSUInteger)index;
- 判斷當(dāng)前字符串對象和傳入的字符串對象的內(nèi)容是否相同
- (BOOL)isEqualToString:(NSString *)aString;
注意:不可以使用==來判斷兩個OC字符串的內(nèi)容是否相同镰吆, ==運算符的作用: 比較左右兩邊的數(shù)據(jù)是否相同,如果兩邊都是指針變量跑慕,那么比較的是指針變量的值也就是地址万皿。 - 將C語言的字符串轉(zhuǎn)換為OC字符串對象
+ (instancetype)stringWithUTF8String:(NSString *)string;
- 將OC字符串對象轉(zhuǎn)換為C語言的字符串
@property (nullable, readonly) __strong const char *UTF8String
- 將字符串寫入到指定的文件中
- (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
- 將文件中的內(nèi)容讀取到字符串中
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
- 使用NSURL讀寫資源,字符串提供了對應(yīng)的方法去讀寫NSURL對象中封裝的資源路徑
//從指定資源路徑讀取文本內(nèi)容
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//將字符串的內(nèi)容寫入到資源路徑中
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
// 如果要向網(wǎng)頁或者ftp寫內(nèi)容要有權(quán)限
10.字符串比較
- (NSComparisonResult)compare:(NSString *)string;
11.字符串比較:附加條件的比較
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- 判斷字符串是否以指定的字符串開頭
- (BOOL)hasPrefix:(NSString *)str;
- 判斷字符串是否以指定的字符串結(jié)尾
- (BOOL)hasSuffix:(NSString *)str;
14.在字符串中搜索字符串
- (NSRange)rangeOfString:(NSString *)searchString;
- 從指定的下標出一直截取到最后
- (NSString *)substringFromIndex:(NSUInteger)from;
- 從第0個開始截取指定的個數(shù)
- (NSString *)substringToIndex:(NSUInteger)to;
- 截取指定的一段范圍
- (NSString *)substringWithRange:(NSRange)range;
- 字符串替換
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
19.將轉(zhuǎn)換字符串大小寫
@property (readonly, copy) NSString *uppercaseString; // 轉(zhuǎn)換為大寫
@property (readonly, copy) NSString *lowercaseString; // 換換為小寫
NSMutableString的初始化
NSMutableString為可變字符串,無論修改多少次相寇,對象始終只有一個慰于,每次修改字符串的時候不會再重新創(chuàng)建對象。NSMutableString繼承自NSString唤衫。
NSMutableString *str1 = [[NSMutableString alloc]init];
NSMutableString *str2 = [NSMutableString string];
注意:不能直接初始化一個字符串常量給NSMutableString
例如:NSMutableString *str = @"xx_cc";因為@"xx_cc"是一個父類對象,而str指針是一個子類指針绵脯,子類指針不能指向父類對象佳励,當(dāng)調(diào)用str的子類獨有方法的時候就會出錯。
NSMutableString的常用方法
- 追加新的字符串
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... ;
- NSMutableString轉(zhuǎn)化為NSString蛆挫,轉(zhuǎn)化后就具備了恒定性
+ (instancetype)stringWithString:(NSString *)string;
NSString與NSMutableString的使用場景
需要多次使用一個固定的字符串的時盡量使用NSString赃承,不會創(chuàng)建多余的重復(fù)的對象。而當(dāng)需要大量拼接字符串的時候悴侵,需要使用NSMutablString瞧剖,保證每次拼接都是操作一個對象,不會重復(fù)創(chuàng)建多個對象可免。