NSString与NSMutableString的应用小结
2016-07-12 20:00
597 查看
一. 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 ==NSNotFo d224 und) { 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);
相关文章推荐
- 数据库链接字符串查询网站
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- C#算法函数:获取一个字符串中的最大长度的数字
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析
- PowerShell实现在字符串中查找大写字母
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- PowerShell中字符串使用单引号和双引号的区别