NSString以及对字符串的增删改查
NSString
什么是NSString?
一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类
如何创建字符串对象
通过不同的方式创建字符串,字符串对象储存的位置也不一样
>如果是通过字符串常量创建,那么字符串对象存储在常量区中
>如果是通过alloc initWithFormat/stringWithFormat创建,那么字符串对象存储在堆区中
而且需要注意:
>不同的平台存储的方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就是两个对象
>不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次alloc都会创建一个新的对象,如果是在Xcode6以上那么alloc多次指向同一块存储空间
//1.通过字符串常量创建 //注意:如果是通过字符串常量创建对象,并且字符串常量的内容一致,那么如果创建多个字符串对象,多个对象指向同一块存储空间 NSString *str1 = @"lnj"; NSString *str11 = @"lnj"; NSLog(@"str1 = %p, str11 = %p", str1 ,str11); //2.通过alloc init创建 //只要调用alloc就会在堆内存中开辟一块存储空间 NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"]; NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"]; NSLog(@"str2 = %p, str22 = %p", str2, str22); //3.通过类工厂方法创建/ stringWithFormat //内部其实就是封装了alloc init NSString *str3 = [NSString stringWithFormat:@"zs"]; NSString *str33= [NSString stringWithFormat:@"zs"]; /* 注意:一般情况下,只要是通过alloc或者类工厂方法创建的对象,每次都会在堆内存中开辟一块新的存储空间 但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们 而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们 */ NSString *str4 = [[NSString alloc]initWithString:@"ls"]; NSString *str44 = [[NSString alloc]initWithString:@"ls"]; NSLog(@"str4 = %p, str44 = %p", str4, str44);
字符串读写上
问题1:如何从文件中读取字符串?什么是绝对路径?编码的常用格式是什么?错误信息是如何读取的?
/* file: 文件路径, encoding: 编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8 error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil 注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径) */ NSString *path = @"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"; NSError *error = nil; // 从文件中读取字符串 NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error == nil) { NSLog(@"str = %@", str); }else { //localizedDescription 打印真正错误信息 NSLog(@"error = %@", [error localizedDescription]); }
问题2:如何将字符串写入到文件中?
SString *str = @"iOS0601基础班"; // atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件 // 如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件 NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt"; BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"flag = %i", flag);
字符串读写下(通过URL获取数据)
问题1:什么是URL?
答:
- URL的全称是Uniform Resource Locator(统一资源定位符)
- URL是互联网上标准资源的地址
- 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
- 根据一个URL就能找到唯一的一个资源
问题2:书写URL格式?
答: URL = 协议头://主机地址/路径
问题3:如何创建URL
通过alloc 或者类工厂方法创建 NSURL *url = [NSURL URLWithString:@"file:///Users/LNJ/Desktop/str.txt"]; NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/LNJ/Desktop/str.txt"]; 通过文件路径创建(默认就是file协议的) NSURL *url = [NSURL fileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];
问题4:如何获取本地路径的信息?获取本地路径信息的方法有什么注意点?
答:获取本地路径信息--fileURLWithPath
方法一:
1.字符串保存路径
NSString *path = @"file://192.168.13.10/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"; NSLog(@"url编码前: %@", path);
2.将路径中中文转换为UTF-8编码格式
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"url编码后: %@", path);
方法二:
1.字符串保存路径,如果访问本机的文件,
可以省略主机地址
NSString *path = @"file:///Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"; NSLog(@"url编码前: %@", path);
2.将路径中中文转换为UTF-8编码格式
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"url编码后: %@", path); NSURL *url = [NSURL URLWithString:path];
3.获取本地路径的信息
NSURL *url = [NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"]; NSError *error = nil; NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; if (error == nil) { NSLog(@"str = %@", str); }else{ NSLog(@"error = %@", [error localizedDescription]); }
注意点:
- URLWithString: 方法不支持中文,所以无法成功创建URL,必须先对路径字符串进行编码
- fileURLWithPath: 方法支持中文,并且省略协议头,但是只能获取本地方法
问题5:如何获取网络路径的信息?
答: 获取网络路径的信息--URLWithString
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSLog(@"str = %@", str);
问题6:如何将信息写入到指定文件?
答:
方法一:
NSString *str = @"lnj"; NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夹/abc.txt"; path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:path]; [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
方法二:
NSString *str = @"lnj"; NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夹/abc.txt"; NSURL *url = [NSURL fileURLWithPath:path]; [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
总结:
- 如果多次往同一个文件中写入内容,那么后一次的会覆盖前一次的
- 方法名中没有file,路径中要添加上file协议头,如果方法名中有file,路径中就不需要file协议头
字符串比较
NSString *str1 =
@"abc";
NSString *str2 = @"ABC";
问题1:如何比较两个字符串的"内容"是否相同?
答:
BOOL flag = [str1 isEqualToString:str2]; NSLog(@"flag = %i", flag);
问题2:如何比较两个字符串的"地址"是否相同?
flag = (str1 == str2); NSLog(@"flag = %i", flag);
问题3:如何比较字符串的大小?
答:使用方法compare:
// NSOrderedAscending 前面的小于后面的 // 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; }
问题4:如何忽略大小写进行比较?
答:
switch ([str1 caseInsensitiveCompare:str2]) { case NSOrderedAscending: NSLog(@"str1小于str2"); break; case NSOrderedSame: NSLog(@"str1等于str2"); break; case NSOrderedDescending: NSLog(@"str1大于str2"); break; default: break; }
字符串搜索
理解几个搜索字符串方法的本质
NSString *str = @"http://www.520it.com/img/lnj.gif";
问题1:如何判断字符串是以什么开头的?本质是什么?
答:
// 本质就是从字符串的第一个字符开始匹配, 只要不匹配就返回NO if ([str hasPrefix:@"http://"]) { NSLog(@"是一个URL"); }else { NSLog(@"不是一个URL"); }
问题2:如何判断字符串是否以什么结尾的?本质是什么?
答:
// 本质就是从字符串的最后一个字符开始匹配, 只要不匹配就返回NO if ([str hasSuffix:@".gif"]) { NSLog(@"动态图片"); }else{ NSLog(@"不是动态图片"); }
问题3:如何判断字符串中是否包含520it.com?本质是什么?
答:
NSString *str = @"abcd"; // 只要str中包含该字符串, 那么就会返回该字符串在str中的起始位置以及该字符串的长度 // location从0开始 , length从1开始 // 如果str中没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound NSRange range = [str rangeOfString:@"lnj"]; // if (range.location == NSNotFound) { if (range.length == 0){ NSLog(@"str中没有需要查找的字符串"); }else{ NSLog(@"str中有需要查找的字符串"); NSLog(@"location = %lu, length = %lu", range.location, range.length); }
字符串截取
OC中的结构体,使用什么开头的方法创建
NSString *str = @"<head>小码哥</head>";
问题1:如何获取指定范围内的字符串?
答:
1.动态获取截取的起始位置 NSUInteger location = [str rangeOfString:@">"].location + 1; 2.动态获取截取的长度 // 注意:rangeOfString是从左至右的开始查找, 只要找到就不找了 NSUInteger length = [str rangeOfString:@"</"].location - location; NSRange range = NSMakeRange(location, length); NSString *newStr = [str substringWithRange:range]; NSLog(@"str = %@", str); NSLog(@"newStr = %@", newStr);
问题2:如何截取字符串?
答:
/* <head>小码哥</head> --> 小码哥</head> --> 小码哥 <head>小码哥</head> --> <head>小码哥 --> 小码哥 */ NSUInteger location = [str rangeOfString:@">"].location + 1; NSString *newStr = [str substringFromIndex:location]; NSLog(@"newStr = %@", newStr); location = [newStr rangeOfString:@"</"].location; // 改变了指针的指向, 并不是修改了原来的字符串 newStr = [newStr substringToIndex:location]; NSLog(@"newStr = %@", newStr);
字符串替换
了解字符串替换方法,和怎么填方法中的参数
stringByReplacingOccurrencesOfString:
stringByTrimmingCharactersInSet:
问题1:如何替换字符串中的部分字符?
答:
//需求: 将&符号替换为/ NSString *str = @"http:&&www.520it.com&img&lnj.gif"; // OccurrencesOfString: 要替换谁 // withString: 用谁替换 NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"]; NSLog(@"newStr = %@", newStr);
问题2:如何对字符串首位进行处理?
答:
NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF"; NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet]; NSString *newStr = [str stringByTrimmingCharactersInSet:set]; NSLog(@"newStr = |%@|", newStr);
字符串和路径
获取路径方法的本质
NSString *str = @"User/lnj/Desktop/lnj.txt.jpg";
问题1:如何判断是否是绝对路径?
答:
- 其实:本质就是判断字符串是否以/开头
if([str isAbsolutePath]) { NSLog(@"是绝对路径"); }else{ NSLog(@"不是绝对路径"); }
问题2:如何获取文件路径中的最后一个目录?
答: 本质:就是获取路径中最后一个/后面的内容
NSString *newStr = [str lastPathComponent]; NSLog(@"%@", newStr);
问题3:如何删除文件路径中的最后一个目录?
答:
- 本质:就是删除最后一个/后面的内容, 包括/也会被删除
NSString *newStr = [str stringByDeletingLastPathComponent]; NSLog(@"%@", newStr);
问题4:如何给文件路径添加一个目录?
答:
- 本质:就是在字符串的末尾加上一个/ 和指定的内容
- 注意: 如果路径后面已经有了/, 那么就不会添加了
- 如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
NSString *newStr = [str stringByAppendingPathComponent:@"xmg"]; NSLog(@"%@", newStr);
问题5:如何获取路径中文件的扩展名?
答:
- 本质:就是从字符串的末尾开始查找., 截取第一个.后面的内容
NSString *newStr = [str pathExtension]; NSLog(@"%@", newStr);
问题6:如何删除路径中文件的扩展名?
答:
- 本质就是从字符串的末尾开始查找.,删除第一个.和.后面的内容
NSString *newStr = [str stringByDeletingPathExtension]; NSLog(@"%@", newStr);
问题7:如何给文件路径添加一个扩展名?
答:
- 本质:就是在字符串的末尾加上一个.和指定的内容
NSString *newStr = [str stringByAppendingPathExtension:@"jpg"]; NSLog(@"%@", newStr);
问题1:如何将将字符串转换为大写?
答:
NSString *newStr = [str uppercaseString]; NSLog(@"%@", newStr);
问题2:如何将字符串转换为小写?
答:
NSString *newStr2 = [newStr lowercaseString]; NSLog(@"%@", newStr2);
htpp://www.520it.com/img/lnj.GIF;
问题3:如何将字符串的首字符转换为大写
答:
NSString *newStr = [str capitalizedString]; NSLog(@"%@", newStr);
问题4:如何字符串与基本数据类型的转换?
答:
NSString *str1 = @"110"; NSString *str2 = @"120"; // str1 + str2; // 错误 int value1 = [str1 intValue]; int value2 = [str2 intValue]; NSLog(@"sum = %i", value1 + value2); // 注意: 如果不是int,double,float,bool,integer,longlong这些类型就不要乱用 NSString *str3 = @"abc"; int value3 = [str3 intValue]; NSLog(@"value3 = %i", value3);
问题5:如何C语言字符串和OC字符串之间的转换?
答:
char *cStr = "lnj"; NSString *str = [NSString stringWithUTF8String:cStr]; NSLog(@"str = %@", str); NSString *newStr = @"lmj"; const char *cStr2 = [newStr UTF8String]; NSLog(@"cStr2 = %s", cStr2);