参考自xx_cc的简书文章
NSString创建与内存存储
NSString的本质是一个类,最标准的创建NSString对象的方式如下:
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
使用这种方式创建的字符串是一个空的字符@""
OC提供了一种更为快速的创建字符串对象的方式:使用前缀@
NSString *str1 = @"rose";
@"rose"本质上是一个NSString对象,这个对象中存储的是字符串"rose"。将这个字符串对象的地址返回赋值给str1指针。
NSString的恒定性
使用@快速创建字符串对象的时候,这个字符串对象是存储在常量区(数据段) 的。
当我们调用NSString的类方法来创建对象的时候.创建的字符串对象是存储在堆区。
NSString *str = @"jack";
NSString *str1 = [NSString new];
NSLog(@"str:%p",str); // str:0x100001040
NSLog(@"str1:%p",str1); // str1:0x7fff97f512e8
重新为字符串指针初始化值的时候,会创建一个字符串对象并将这个字符串对象的地址重新赋值给字符串指针变量。
NSString *str1 = @"jack";
NSLog(@"str1:%p",str1); // str1:0x100001038
str1 = @"rose";
NSLog(@"str1:%p",str1); // str1:0x100001078
当系统准备要在内存中创建字符串对象的时候,会先检查内存中是否有相同内容的字符串对象,如果有,直接指向该内存区域,如果没有才会重新创建。
NSString *str1 = @"jack";
NSLog(@"str1:%p",str1); // str1:0x100001038
str1 = nil;
NSString *str2 = @"jack";
NSLog(@"str2:%p",str2); // str1:0x100001038
注意:存储在常量区的数据不会被回收. 所以存储在常量区的字符串对象也不会被回收.
NSString类的常用方法
- 使用拼接的方式创建1个NSString对象
+ (instancetype)stringWithFormat:(NSString *)format, ...
- 获取字符串的长度
@property (readonly) NSUInteger length;
- 得到字符串中指定下标的字符,返回值是unichar类型,打印使用%C
- (unichar)characterAtIndex:(NSUInteger)index;
- 判断当前字符串对象和传入的字符串对象的内容是否相同
- (BOOL)isEqualToString:(NSString *)aString;
注意:不可以使用==来判断两个OC字符串的内容是否相同, ==运算符的作用: 比较左右两边的数据是否相同,如果两边都是指针变量,那么比较的是指针变量的值也就是地址。 - 将C语言的字符串转换为OC字符串对象
+ (instancetype)stringWithUTF8String:(NSString *)string;
- 将OC字符串对象转换为C语言的字符串
@property (nullable, readonly) __strong const char *UTF8String
- 将字符串写入到指定的文件中
- (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
- 将文件中的内容读取到字符串中
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
- 使用NSURL读写资源,字符串提供了对应的方法去读写NSURL对象中封装的资源路径
//从指定资源路径读取文本内容
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//将字符串的内容写入到资源路径中
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
// 如果要向网页或者ftp写内容要有权限
10.字符串比较
- (NSComparisonResult)compare:(NSString *)string;
11.字符串比较:附加条件的比较
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- 判断字符串是否以指定的字符串开头
- (BOOL)hasPrefix:(NSString *)str;
- 判断字符串是否以指定的字符串结尾
- (BOOL)hasSuffix:(NSString *)str;
14.在字符串中搜索字符串
- (NSRange)rangeOfString:(NSString *)searchString;
- 从指定的下标出一直截取到最后
- (NSString *)substringFromIndex:(NSUInteger)from;
- 从第0个开始截取指定的个数
- (NSString *)substringToIndex:(NSUInteger)to;
- 截取指定的一段范围
- (NSString *)substringWithRange:(NSRange)range;
- 字符串替换
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
19.将转换字符串大小写
@property (readonly, copy) NSString *uppercaseString; // 转换为大写
@property (readonly, copy) NSString *lowercaseString; // 换换为小写
NSMutableString的初始化
NSMutableString为可变字符串,无论修改多少次,对象始终只有一个,每次修改字符串的时候不会再重新创建对象。NSMutableString继承自NSString。
NSMutableString *str1 = [[NSMutableString alloc]init];
NSMutableString *str2 = [NSMutableString string];
注意:不能直接初始化一个字符串常量给NSMutableString
例如:NSMutableString *str = @"xx_cc";因为@"xx_cc"是一个父类对象,而str指针是一个子类指针,子类指针不能指向父类对象,当调用str的子类独有方法的时候就会出错。
NSMutableString的常用方法
- 追加新的字符串
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... ;
- NSMutableString转化为NSString,转化后就具备了恒定性
+ (instancetype)stringWithString:(NSString *)string;
NSString与NSMutableString的使用场景
需要多次使用一个固定的字符串的时尽量使用NSString,不会创建多余的重复的对象。而当需要大量拼接字符串的时候,需要使用NSMutablString,保证每次拼接都是操作一个对象,不会重复创建多个对象。