一. NSString
1.见名知意,Objective-C中字符串是一个对象,NSString是用于储存字符串对象的。
2.字符长度
(1).NSString类型,长度用length计算,中英文(包括各类符号)都各自只占一个字节。
(2).在Xcode中C语言中一个汉字(包括各类符号)占3个字节,英文(包括各类符号)占一个字节。
3.通过不同的方式创建OC字符串,字符串的存储位置也不一样
(1).如果是通过字符串常量创建,并且字符串常量的内容一致,那么创建的多个对象指向常量区中同一块存储空间
NSString *str1 = @"abc";
NSString *str2 = @"abc";
NSLog(@"str1 = %p str2 = %p",str1,str2);
(2).如果是通过alloc initWithFormat/stringWithFormat创建,那么字符串对象存储在堆区中;在OS X中用上述两方法创建相同对象,系统会自动优化,让都指向同一块内存空间;在iOS中用上述两方法创建对象,会在堆区中开辟不同的存储空间
可以用下面代码在不同的平台上验证:
NSString *str3 = [[NSString alloc]initWithFormat:@"abc"];
NSString *str4 = [[NSString alloc]initWithFormat:@"abc"];
NSString *str5 = [NSString stringWithFormat:@"abc"];
NSString *str6 = [NSString stringWithFormat:@"abc"];
NSLog(@"str3 = %p str4 = %p str5 = %p str6 = %p",str3,str4,str5,str6);
(3).注意:其实OC中只要是用alloc创建的对象,每次都会在堆区新开辟空间创建对象;但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们,而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
可以用下面代码验证:
NSString *str7 = [NSString stringWithString:@"abc"];
NSString *str8 = [NSString stringWithString:@"abc"];
NSString *str9 = [NSString stringWithString: [str7 copy]];
NSString *str10 = [NSString stringWithString: [str7 mutableCopy]];
NSLog(@"str7 = %p str8 = %p str9 = %p str10 = %p ",str7,str8,str9,str10);
4.字符串的读写<1>
(1).从文件中读取字符串,使用+ (instancetype)stringWithContentsOfFile:(NSString )path encoding:(NSStringEncoding)enc error:(NSError *)error;
file: 文件路径
encoding: 文件中的文字编码类型,编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8
error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil ;注意error是(NSError )类型,是地址的地址,运用时要注意!
代码如下:
NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";
NSError *error = nil;
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
//可以先判断是否有错误,再输出;如果不关心错误,可以直接在方法里面写nil
if (error == nil) {
NSLog(@"%@",str);
} else {
//localizedDescription:这是属性会输出具体的错误原因
//localizedFailureReason:这个属性会简单提示错误原因
NSLog(@"%@",error.localizedDescription);
NSLog(@"%@",error.localizedFailureReason);
NSLog(@"%@",error);
}
(2).把字符串写入到文件中,使用- (BOOL)writeToFile:(NSString )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError *)error;
该方法返回一个BOOL,成功写入返回YES,失败返回NO;路径中没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。
atomically:如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件;如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";
NSError *error = nil;
NSString *str = @"天天编程,GO GO GO!";
BOOL boo = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (boo) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败");
}
5.字符串的读写<2>
URL(统一资源定位符):协议头 + 主机地址 + 文件路径
(1).读取文件,使用+ (instancetype)stringWithContentsOfURL:(NSURL )url encoding:(NSStringEncoding)enc error:(NSError *)error;
(a).当路径中没有中文
代码如下:
NSURL *url1 = [NSURL URLWithString:@"file://172.17.26.132/Users/MAC_SJM/Desktop/SS.txt"];
//如果加载的资源是本机上的资源,那么URL中的主机地址可以省略;
//虽然主机地址可以省略,但是需要注意,文件路劲中最前面的/不能省略,文件路径最前面的/代表根路径
NSURL *url2 = [NSURL URLWithString:@"file:///Users/MAC_SJM/Desktop/SS.txt"];
NSString *str1 = [NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
NSString *str2 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",str1);
NSLog(@"%@",str2);
(b).当路径中有中文
代码如下:
//当用URLWithString:方法时,因为url不支持中文,如果URL中包含中文,那么无法访问,如果包含中文,就得先进行编码
NSString *path = @"file://172.17.26.132/Users/MAC_SJM/Desktop/未命名文件夹/SS.txt";
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url1 = [NSURL URLWithString:path];
//如果是通过NSURL的fileURLWithPath:方法创建URL,那么系统会自动给我们传入的字符串添加协议头(file://),
//哪怕URL中包含中文也可以进行访问,系统内部会自动对URL中包含的中文进行处理
NSURL *url2 = [NSURL fileURLWithPath:@"@"/Users/MAC_SJM/Desktop/未命名文件夹/SS.txt""];
NSString *str1 = [NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
NSString *str2 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",str1);
NSLog(@"%@",str2);
(2).写入文件,使用- (BOOL)writeToURL:(NSURL )url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError *)error;
该方法返回一个BOOL,成功写入返回YES,失败返回NO;路径中没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。
代码如下:
//URL不包含中文
NSString *path1 = @"file://172.17.26.132/Users/MAC_SJM/Desktop/SS.txt";
NSURL *url1 = [NSURL URLWithString:path1];
//URL包含中文,使用URLWithString:方法要先进行编码
NSString *path2 = @"file://172.17.26.132/Users/MAC_SJM/Desktop/未命名文件夹/SS1.txt";
path2 = [path2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url2 = [NSURL URLWithString:path2];
//URL包含中文,使用fileURLWithPath:方法
NSURL *url3 = [NSURL fileURLWithPath:@"/Users/MAC_SJM/Desktop/未命名文件夹/SS2.txt"];
NSString *str = @"你好";
//URL没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。
[str writeToURL:url1 atomically:YES encoding:NSUTF8StringEncoding error:nil];
[str writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
[str writeToURL:url3 atomically:YES encoding:NSUTF8StringEncoding error:nil];
6.字符串的比较
NSString *str1 = @"abcD";
NSString *str2 = @"abcd";
//isEqualToString:是比较内容是否相同
if ([str1 isEqualToString:str2]) {
NSLog(@"内容相同");
} else {
NSLog(@"内容不相同");
}
//str1 == str2 是比较字符串地址是否相等
if (str1 == str2) {
NSLog(@"地址相同");
} else {
NSLog(@"地址不相同");
}
//比较字符串大小
//NSOrderedAscending = -1L 小于
//NSOrderedSame 等于
//NSOrderedDescending 大于
switch ([str1 compare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
//忽略大小写比较大小
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
7.字符串搜索
// 1. - (BOOL)hasPrefix:(NSString *)aString;方法是从前往后找
NSString *str1 = @"abcdef";
if ([str1 hasPrefix:@"ab"]) {
NSLog(@"前面有%@",@"ab");
} else {
NSLog(@"前面没有%@",@"ab");
}
// 2. - (BOOL)hasSuffix:(NSString *)aString;方法是从后往前找
NSString *str2 = @"abcd";
if ([str2 hasSuffix:@"cd"]) {
NSLog(@"后面有%@",@"cd");
} else {
NSLog(@"后面没有%@",@"cd");
}
// 3. - (NSRange)rangeOfString:(NSString *)aString;判断字符串是否包含某个字符串,返回一个NSRange变量,
//如果没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
// NSRange是一个结构体,用于查找到的字符串信息
//typedef struct _NSRange {
// NSUInteger location;//存储查找到的字符串起始位置,从0开始,类似数组下标
// NSUInteger length;//存储查找到的字符串长度
// } NSRange;
NSString *str3 = @"abcdef";
NSRange range = [str3 rangeOfString:@"de"];
if (range.location ==NSNotFound) {
NSLog(@"没有找到");
} else {
//+ (NSValue *)valueWithRange:(NSRange)range;方法用于把NSRange变量转化成对象
NSLog(@"%@", [NSValue valueWithRange:range]);
}
8.字符串的截取
(1).- (NSString *)substringWithRange:(NSRange)range;方法是根据NSRange变量截取字符串
(2).- (NSString *)substringToIndex:(NSUInteger)to;方法是从头开始截取,截取n个字符
(3).- (NSString *)substringFromIndex:(NSUInteger)from;方法是从第n个开始截取,一直截取到最后
代码如下:
NSString *str = @"string";
NSRange range = NSMakeRange(3, 3);
NSString *str2 = [str substringWithRange:range];
NSLog(@"%@",str2);
NSString *str3 = [str substringToIndex:3];
NSLog(@"%@",str3);
NSString *str4 = [str substringFromIndex:3];
NSLog(@"%@",str4);
9.字符串的替换和过滤
NSString *str = @" www,&baidu&,com ";
NSLog(@"%@",str);
//OccurrencesOfString:要替换的字符串
//withString:用谁替换
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"&" withString:@"."];
NSLog(@"%@",str1);
//CharactersInRange:在那个区间替换
//withString:用谁替换
NSString *str2 = [str stringByReplacingCharactersInRange:NSMakeRange(3, 7) withString:@".baidu."];
NSLog(@"%@",str2);
//stringByReplacingPercentEscapesUsingEncoding:方法是把字符串转换成NSUTF8StringEncoding
NSString *str3 = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",str3);
//NSCharacterSet类可定义过滤集合,用于过滤字符串,whitespaceAndNewlineCharacterSet代表过滤空格
NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSString *str4 = [str stringByTrimmingCharactersInSet:set];
NSLog(@"%@",str4);
10.字符串与路径
NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";
//1.判断是否是绝对路径
//实质:是判断是否是以/开头
NSLog(@"%@",[path isAbsolutePath] ? @"是绝对路径" : @"不是绝对路径");
//2.判断是否是最后一个目录
//实质:是获取最后一个/后面的内容
NSLog(@"%@",[path lastPathComponent] );
//3.删除最后一个目录的内容
//实质:是删除最后一个/后面的内容, 包括/也会被删除
NSLog(@"%@",[path stringByDeletingLastPathComponent]);
//4.给文件路径添加一个目录
//实质:在字符串的末尾加上一个/和指定的内容
// 如果路径后面已经有了/, 那么就不会添加了
// 如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
NSLog(@"%@",[path stringByAppendingPathComponent:@"new/"]);
//5.获取路径中文件的扩展名
//实质是:从字符串后面往前找,找到第一个点.,截取点后面的内容
NSLog(@"%@",[path pathExtension]);
//6.删除文件的扩展名
//实质:是从字符串后面往前找,找到第一个点.,删除点后面的内容
NSLog(@"%@",[path stringByDeletingPathExtension]);
//7.添加扩展名
//实质:是在最后面加上点.和指定的扩展名
NSLog(@"%@",[path stringByAppendingPathExtension:@"pdf"]);
11.字符串的转换
//字符串转换成大写
NSString *newStr =[oldStr uppercaseString];
NSLog(@"%@",newStr);
//字符串转换成小写
NSString *newStr2 = [newStr lowercaseString];
NSLog(@"%@",newStr2);
//单词首字符大写
NSString *newStr3 = [oldStr capitalizedString];
NSLog(@"%@",newStr3);
//字符串与基本数据类型的转换
//注意:如果不是int,double,float,bool,integer,longlong这些类型就不能转换
NSString *str1 = @"100";
NSString *str2 = @"12.5";
int value1 = [str1 intValue];
double value2 = [str2 floatValue];
NSLog(@"%.1f",value1 + value2);
//C语言字符串与OC字符串的转换
char *cStr1 = "hello world";
NSString *ocStr = [NSString stringWithUTF8String:cStr1];
NSLog(@"%@",ocStr);
const char * cStr2 = [oldStr UTF8String];
NSLog(@"%s",cStr2);
二. NSMutableString
1.NSMutableString是NSString的子类,在NSString上有的方法,NSMutableString也可以用。
2.NSMutableString的增删查改操作
//创建一个新的字符串
NSMutableString *strM = [NSMutableString string];
//添加字符串
[strM appendString:@"abc"];
NSLog(@"%@",strM);
[strM appendFormat:@"def"];
NSLog(@"%@",strM);
//删除指定字符串
NSRange range1 = NSMakeRange(3, 2);
[strM deleteCharactersInRange:range1];
NSLog(@"%@",strM);
//插入字符串
NSRange range2 =NSMakeRange(1, 2);
[strM insertString:@"A" atIndex:range2.location];
NSLog(@"%@",strM);
//替换字符串
//OccurrencesOfString:需要替换的子字符串
//withString:用什么替代
//返回值:替换了多少个字符
NSUInteger count = [strM replaceOccurrencesOfString:@"A" withString:@"B" options:0 range:NSMakeRange(0, strM.length)];
NSLog(@"%lu",count);
NSLog(@"%@",strM);