——–NSString——–
1).是一个数据类型,保存OC字符串,本质上是一个类。既然是一个类,那么使用它创建对象的方法如下,这样创建出来的字符串是空的.
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
2).是OC中最常用的一个类,还有更快速的创建方式,使用前缀@.
NSString *str4 = @”jack”; 说明: 本质上jack是一个NSString对象,存储的是字面值,将这个字符串对象的地址返回给str4指针.
3).NSString字符串的恒定性. 只要一旦创建那么字符串的内容无法更改.
当我们重新为字符串指针初始化值的时候,并不是直接将指针指向的对象的内容改变,而是重新创建了一个对象,再将这个对象的地址返回。当系统准备要在内存中创建字符串对象的时候,那么会先检查内存中(在常量区/堆区各自寻找)是否有相同内容的字符串,如果有直接返回地址,如果没有才会重新创建。
当我们使用简要的创建字符串对象的时候如2). 这个时候字符串对象存放在常量区的. 当我们使用类方法进行创建的时候:
NSString *str5 = [NSString stringWithFormat:@"jack"];
NSString *str6 = [NSString new];
这个时候的字符串是放在堆区的。 注意:
NSString *str7 = @"jack";
str7 = nil;
NSString *str8 = @"jack";//储存在常量区的数据在程序结束之前不会回收,str7与str8的指向的位置是同一个jack
4). 其中常用的一些方法:
(1) 拼接字符串方法 +(instancetype)stringWithFormat:(NSString *)format, …NS_FORMAT_FUNCTION(1,2);
(2) 得到字符串的长度,利用字符串的属性 @property (readonly)
(3)下标方法- (unichar)characterAtIndex:(NSUInteger)index;要打印的话使用%C.
(4)判断两个OC字符串的内容是否相等,不能用==,因为对于两个指针而言==表示比较的是指针所指向的地址。而我们要比的是两个字符串指向的内容是否相同,应该用:[str1 isEqualToString: str2];
(5)将C语言字符串转换成OC字符串对象,将OC字符串转成C字符串.在控制台输入的时候常用.
char *str = "jack";
NSString *str9 = [NSString stringWithUTF8String:str];
char *str10 = str9.UTF8String;
5).将字符串内容写到磁盘上的文件之中
str1 writeToFile:(nonnull NSString ) atomically:(BOOL) encoding:(NSStringEncoding) error:(NSError _Nullable __autoreleasing * _Nullable)
参数1: 文件的路径
参数2: YES/NO YES先写一个临时文件,写成功再搬到指定路径之中,否则直接写在目的文件中 安全/效率的考虑
参数3:指定写入的时候使用的编码。一般用UTF-8编码, 枚举中是4
参数4:二级指针,写入成功为nil,如果写入失败,这个指针指向一个错误对象,描述发送的错误信息,如果调用该对象的 localizedDescription 方法可以得到对象的简要错误信息
//一个例子
NSString *str1 = @"jack";
NSError *err;
BOOL res = [str1 writeToFile:@"/Users/yuhuiqiang/Desktop/abc.txt" atomically:NO encoding:NSUTF8StringEncoding error:&err];
if(!err)
NSLog(@"success");
else
NSLog(@"%@",err);
6).从磁盘中的文件中读取字符串
NSString *str2 = [NSString stringWithContentsOfFile:@"/Users/warwick/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:nil];//相关参数与读文件类似.
7).字符串的比较:比较的其实是第一个不相同的字符的ASCII值
NSComparisonResult res = [str1 compare:str2];//结果也可以用int返回
如果需要忽略大小写的比较,则用
NSComparisonResult res = [str1 compare:str2 options:1];//options是一个枚举类型,可以详细看下选项
NSString *img1 = @"10086.bmp";
NSString *img2 = @"10010.bmp";
[img1 compare:img2 options:64];//甚至可以比较字符串中数字的大小,仅限于格式固定的!一般用来序号的比较
8).字符串的开始与结束判断:想象一下如果要判断一个网址是否合法,需要对网址的开始与结束符进行判断,一个简单的例子
NSString *str = @"http://www.qq.com";
BOOL res = [str hasPrefix:@"http://"]&[str hasSuffix:@".com";
9).字符串的查找问题
NSString *str = @"I love my country,I love my school";
NSRange range = [str rangeOfString:@"love"];//出现love的范围,NSRange代表子串在主串从前往后第一次出现的下标以及匹配的长度,从后往前的话加一个options:NSBackwardSearch
if(range.length==0)//range.location==NSNotFound也可以作为判断条件
NSLog(@"没有找到");
else
NSLog(@"找到了");
10).字符串的截取
NSString *str = @"I love my country,I love my school";
NSString *res1 = [str substringFromIndex:3];//从下标3开始截取到末尾
NSString *res2 = [str substringToIndex:3];//从下标0开始截取,指定的个数是3
NSString *res3 = [str substringWithRange:NSMakeRange(2,3)];//从第2个开始截取截取3个字符,截取指定的一段范围
11).字符串的替换
NSString *str = @"I love my country,I love my school";
NSString *res = [str stringByReplacingOccurrencesOfString:@"love",withString:@"hate"];//把love替换成hate,注意字符串的恒定性
12).字符串的其他操作
计算字符串的长度,去掉字符串的前后空格,字符串大小写转换等。
NSString *str = @" I love my country,I love my school ";
NSInteger len = [str length];
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceChaacterSet]];//只能去掉字符串的前后空格,中间的不能去掉
str = [str uppercaseString];//转大写
str = [str lowercaseString];//转小写
——–NSMutableStirng——–
继承自NSString,可变字符串类。创建方式:
NSMutableString *str = [NSMutableString string];
[str appendString:@"jack"];
[str appendString:@"rose"];//自始至终都只有1个字符串对象,内容是“jackrose”
NSMutableString *str2 = @"jack"//error,@"jack"是一个NSString对象,用子类的指针指向父类的对象,调用子类独有的方法是会运行错误的
使用建议:平时使用的时候,如果不需要对字符串进行大量的更改,用NSString的效率更高,因此选择NSString类更好。