天天看点

Objective-C中的NSString与NSMutableString详解

——–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类更好。