一 Foundation框架介绍
- 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合。
Foundation框架中的类
- Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)
- Foundation框架提供了非常多好用的类, 比如
NSString : 字符串 NSArray : 数组 NSDictionary : 字典 NSDate : 日期 NSData : 数据 NSNumber : 数字
Foundation框架常见错误
有时候会在不经意之间修改了系统自带的头文件, 比如NSString.h, 这时会出现以下错误:
解决方案很简单, 只需要删除Xcode的缓存即可
- 缓存路径是/Users/用户名/Library/Developer/Xcode/DerivedData(默认情况下, 这是一个隐藏文件夹)
要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下
- 显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
- 隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false
- (输入指令后, 一定要重新启动Finder)
二 NSString
什么是NSString?
- 一个NSString对象就代表一个字符串(文字内容)
- 一般称NSString为字符串类
NSString创建方式
最直接的方式(常量字符串)
- 常量区中的字符串只要内容一致, 不会重复创建
NSString *str1 = @"xxx"; NSString *str3 = @"xxx"; NSLog(@"str1 = %p, str3 = %p", str1, str3); 输出地址一致
- 常量区中的字符串只要内容一致, 不会重复创建
格式化的方式
- 堆区中得字符串哪怕内容一致, 也会重复创建
NSString *str2 = [NSString stringWithFormat:@"xxx"]; NSString *str4 = [NSString stringWithFormat:@"xxx"]; NSLog(@"str2 = %p, str4 = %p", str2, str4); 输出地址不一样
- 堆区中得字符串哪怕内容一致, 也会重复创建
字符串读写
- 从文件中读取
// 用来保存错误信息
NSError *error = nil;
// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/guo/Desktop/xxx.txt" encoding:NSUTF8StringEncoding error:&error];
// 注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径)
// 如果有错误信息
if (error) {
NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
} else { // 如果没有错误信息
NSLog(@"读取成功, 文件内容是:\n%@", str);
}
- 写入文件中
NSString *str = @"V5";
BOOL flag = [str writeToFile:@"/Users/guo/Desktop/xx.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
{
NSLog(@"写入成功");
}
- 重复写入同一文件会覆盖掉上一次的内容
什么是URL
- URL的全称是Uniform Resource Locator(统一资源定位符)
- URL是互联网上标准资源的地址
- 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
- 根据一个URL就能找到唯一的一个资源
URL的格式
- 基本URL包含协议、主机域名(服务器名称\IP地址)、路径
- 可以简单认为: URL == 协议头://主机域名/路径
常见的URL协议头(URL类型)
- http\https :超文本传输协议资源, 网络资源
- ftp :文件传输协议
- file :本地电脑的文件
URL的创建
传入完整的字符串创建
NSURL *url = [NSURL URLWithString:@"file:///Users/guo/Desktop/str.txt"];
通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/guo/Desktop/str.txt"];
使用NSURL读写字符串
- 从URL中读取
// 用来保存错误信息 NSError *error = nil; // 创建URL路径 // NSString *path = @"file://192.168.199.119/Users/guo/Desktop/xx.txt"; // 本机可以省略主机域名 // NSString *path = @"file:///Users/guo/Desktop/xx.txt"; NSURL *url = [NSURL URLWithString:path]; // 利用fileURLWithPath方法创建出来的URL默认协议头为file:// NSURL *url = [NSURL fileURLWithPath:@"/Users/guo/Desktop/xx.txt"]; // 读取文件内容 NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // 如果有错误信息 if (error) { NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]); } else { // 如果没有错误信息 NSLog(@"读取成功, 文件内容是:\n%@", str); }
- 写入URL中
NSString *str = @"哥"; [str writeToURL:[NSURL URLWithString:@"/Users/guo/Desktop/xx.txt"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
字符串比较
NSString大小写处理
全部字符转为大写字母
- - (NSString *)uppercaseString;
全部字符转为小写字母
- - (NSString *)lowercaseString
首字母变大写,其他字母都变小写
- - (NSString *)capitalizedString
NSString比较方法:
- - (BOOL)isEqualToString:(NSString *)aString;
- 两个字符串的内容相同就返回YES, 否则返回NO
NSString *str1 = @"xx";
NSString *str2 = [NSString stringWithFormat:@"xx"];
if ([str1 isEqualToString:str2]) {
NSLog(@"字符串内容一样");
}
if (str1 == str2) {
NSLog(@"字符串地址一样");
}
- - (NSComparisonResult)compare:(NSString *)string;
- 这个方法可以用来比较两个字符串内容的大小
- 比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果
- NSComparisonResult是一个枚举,有3个值:
- 如果左侧 > 右侧,返回NSOrderedDescending,
- 如果左侧 < 右侧,返回NSOrderedAscending,
- 如果左侧 == 右侧返回NSOrderedSame
NSString *str1 = @"abc";
NSString *str2 = @"abd";
switch ([str1 compare:str2]) {
case NSOrderedAscending:
NSLog(@"后面一个字符串大于前面一个");
break;
case NSOrderedDescending:
NSLog(@"后面一个字符串小于前面一个");
break;
case NSOrderedSame:
NSLog(@"两个字符串一样");
break;
}
输出结果: 后面一个字符串大于前面一个
- - (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
- 忽略大小写进行比较,返回值与compare:一致
NSString *str1 = @"abc";
NSString *str2 = @"ABC";
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"后面一个字符串大于前面一个");
break;
case NSOrderedDescending:
NSLog(@"后面一个字符串小于前面一个");
break;
case NSOrderedSame:
NSLog(@"两个字符串一样");
break;
}
输出结果:两个字符串一样
字符串搜索
字符串搜索
- (BOOL)hasPrefix:(NSString *)aString;
- 是否以aString开头
- (BOOL)hasSuffix:(NSString *)aString;
- 是否以aString结尾
- (NSRange)rangeOfString:(NSString *)aString;
- 用来检查字符串内容中是否包含了aString
- 如果包含, 就返回aString的范围
- 如果不包含, NSRange的location为NSNotFound, length为0
NSRange基本概念
- NSRange是Foundation框架中比较常用的结构体, 它的定义如下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
// NSUInteger的定义
typedef unsigned int NSUInteger;
NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
NSRange有2个成员
- NSUInteger location : 表示该范围的起始位置
- NSUInteger length : 表示该范围内的长度
比如@“I love XXX”中的@“XXX”可以用location为7,length为3的范围来表示
NSRange的创建:有3种方式创建一个NSRange变量
- 方式1
NSRange range; range.location = 7; range.length = 3;
- 方式2
NSRange range = {7, 3}; 或 NSRange range = {.location = 7,.length = 3};
- 方式3 : 使用NSMakeRange函数
NSRange range = NSMakeRange(7, 3);
字符串截取
- - (NSString *)substringFromIndex:(NSUInteger)from;
- 从指定位置from开始(包括指定位置的字符)到尾部
NSString *str = @"<head>笑忘书</head>";
str = [str substringFromIndex:7];
NSLog(@"str = %@", str);
输出结果: 笑忘书</head>
- - (NSString *)substringToIndex:(NSUInteger)to;
- 从字符串的开头一直截取到指定的位置to,但不包括该位置的字符
NSString *str = @"<head>笑忘书</head>";
str = [str substringToIndex:10];
NSLog(@"str = %@", str);
输出结果: <head>笑忘书
- - (NSString *)substringWithRange:(NSRange)range;
- 按照所给出的NSRange从字符串中截取子串
NSString *str = @"<head>笑忘书</head>";
NSRange range;
/*
range.location = 6;
range.length = 3;
*/
range.location = [str rangeOfString:@">"].location + 1;
range.length = [str rangeOfString:@"</"].location - range.location;
NSString *res = [str substringWithRange:range];
NSLog(@"res = %@", res);
输出结果: 笑忘书
字符串替换
- - (NSString )stringByReplacingOccurrencesOfString:(NSString )target withString:(NSString *)replacement;
- 用replacement替换target
NSString *str = @"http:**baidu.com*img*xx.gif";
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
NSLog(@"newStr = %@", newStr);
输出结果: http://www.baidu.com/img/xx.gif
- - (NSString )stringByTrimmingCharactersInSet:(NSCharacterSet )set;
- 去除首尾
NSString *str = @" http://baidu.com/img/xx.gif ";
NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"str =|%@|", str);
NSLog(@"newStr =|%@|", newStr);
输出结果:
str =| http://baidu.com/img/xx.gif |
newStr =|http://baidu.com/img/xx.gif|
NSString *str = @"***http://baidu.com/img/xx.gif***";
NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]];
NSLog(@"str =|%@|", str);
NSLog(@"newStr =|%@|", newStr);
输出结果:
str =|***http://baidu.com/img/xx.gif***|
newStr =|http://baidu.com/img/xx.gif|
字符串与路径
- - (BOOL)isAbsolutePath;
- 是否为绝对路径
// 其实就是判断是否以/开头
// NSString *str = @"/Users/Lee/Desktop/xx.txt";
NSString *str = @"Users/Lee/Desktop/xx.txt";
if ([str isAbsolutePath]) {
NSLog(@"是绝对路径");
}else
{
NSLog(@"不是绝对路径");
}
- - (NSString *)lastPathComponent;
- 获得最后一个目录
// 截取最后一个/后面的内容
NSString *str = @"/Users/Lee/Desktop/xx.txt";
NSString *component = [str lastPathComponent];
NSLog(@"component = %@", component);
- - (NSString *)stringByDeletingLastPathComponent;
- 删除最后一个目录
// 其实就是上次最后一个/和之后的内容
NSString *str = @"/Users/Lee/Desktop/xx.txt";
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"newStr = %@", newStr);
- - (NSString )stringByAppendingPathComponent:(NSString )str;
- 在路径的后面拼接一个目录
(也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
- 在路径的后面拼接一个目录
// 其实就是在最后面加上/和要拼接得内容
// 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个
// NSString *str = @"/Users/Lee/Desktop";
NSString *str = @"/Users/Lee/Desktop/";
NSString *newStr = [str stringByAppendingPathComponent:@"xx"];
NSLog(@"newStr = %@", newStr);
- - (NSString *)pathExtension;
- 获得拓展名
// 其实就是从最后面开始截取.之后的内容
// NSString *str = @"xx.txt";
NSString *str = @"abc.xx.txt";
NSString *extension = [str pathExtension];
NSLog(@"extension = %@", extension);
- - (NSString *)stringByDeletingPathExtension;
- 删除尾部的拓展名
// 其实就是上次从最后面开始.之后的内容
// NSString *str = @"xx.txt";
NSString *str = @"abc.xx.txt";
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"newStr = %@", newStr);
- - (NSString )stringByAppendingPathExtension:(NSString )str;
- 在尾部添加一个拓展名
// 其实就是在最后面拼接上.和指定的内容
NSString *str = @"xx";
NSString *newStr = [str stringByAppendingPathExtension:@"gif"];
NSLog(@"newStr = %@", newStr);
字符串与基本数据类型转换
获取字符串的每个字符
- (NSUInteger)length;
- 返回字符串的长度(有多少个文字)
- (unichar)characterAtIndex:(NSUInteger)index;
- 返回index位置对应的字符
字符串和其他数据类型转换
- 转为基本数据类型
- - (double)doubleValue;
- - (float)floatValue;
- - (int)intValue;
NSString *str1 = @"110"; NSString *str2 = @"10"; int res = str1.intValue + str2.intValue; NSLog(@"res = %i", res);
NSString *str1 = @"110"; NSString *str2 = @"10.1"; double res = str1.doubleValue + str2.doubleValue; NSLog(@"res = %f", res);
- 转为C语言中的字符串
- - (char *)UTF8String;
NSString *str = @"abc"; const char *cStr = [str UTF8String]; NSLog(@"cStr = %s", cStr);
char *cStr = "abc"; NSString *str = [NSString stringWithUTF8String:cStr]; NSLog(@"str = %@", str);
- 转为基本数据类型
三 NSMutableString
NSMutableString 类继承NSString类,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串 删除字符串 指定位置插入字符串。
NSMutableString和NSString的区别
- NSString是不可变的, 里面的文字内容是不能进行修改的
- NSMutableString是可变的,里面的文字内容可以随时更改
- NSMutableString能使用NSString的所有方法
字符串中的可变和不可变
- 不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
- 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
- - (void)appendString:(NSString *)aString;
- 拼接aString到最后面
- - (void)appendFormat:(NSString *)format, …;
- 拼接一段格式化字符串到最后面
- - (void)deleteCharactersInRange:(NSRange)range;
- 删除range范围内的字符串
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com"];
// 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
NSRange range = [strM rangeOfString:@"http://"];
[strM deleteCharactersInRange:range];
NSLog(@"strM = %@", strM);
- - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- 在loc这个位置中插入aString
NSMutableString *strM = [NSMutableString stringWithString:@"www.baidu.com"];
// insertString : 需要插入的字符串
// atIndex: 从哪里开始插入
[strM insertString:@"http://" atIndex:0];
NSLog(@"strM = %@", strM);
- -(void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
- 使用aString替换range范围内的字符串
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com/GUO.png"];
NSRange range = [strM rangeOfString:@"GUO"];
// OccurrencesOfString: 需要替换的字符串
// withString: 用什么替换
// options: 替换时的搜索方式
// range: 搜索的范围
// 返回值: 代表替换了多少个字符串
[strM replaceOccurrencesOfString:@"GUO" withString:@"jjj" options:0 range:range];
NSLog(@"strM = %@", strM);
四 NSArray
- 什么是NSArray?
- NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
NSArray的使用注意
- 只能存放任意OC对象, 并且是有顺序的
- 不能存储非OC对象, 比如int\float\double\char\enum\struct等
- 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
NSArray的创建方式
- + (instancetype)array;
- + (instancetype)arrayWithObject:(id)anObject;
- + (instancetype)arrayWithObjects:(id)firstObj, …;
- + (instancetype)arrayWithArray:(NSArray *)array;
- + (id)arrayWithContentsOfFile:(NSString *)path;
- + (id)arrayWithContentsOfURL:(NSURL *)url;
NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。
NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。
NSArray的常用方法
- (NSUInteger)count;
- 获取集合元素个数
- (id)objectAtIndex:(NSUInteger)index;
- 获得index位置的元素
- (BOOL)containsObject:(id)anObject;
- 是否包含某一个元素
- (id)lastObject;
- 返回最后一个元素
- (id)firstObject;
- 返回最后一个元素
- (NSUInteger)indexOfObject:(id)anObject;
- 查找anObject元素在数组中的位置(如果找不到,返回-1)
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
- 在range范围内查找anObject元素在数组中的位置
NSArray的简写形式
数组的创建
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil]; // 简写为: @[@"Jack", @"Rose", @"Jim"];
数组元素的访问
[array objectAtIndex:0]; // 简写为: array[0];
NSArray 遍历
- NSArray的下标遍历
NSArray *arr = @[p1, p2, p3, p4, p5];
for (int i = 0; i < arr.count; ++i) {
Person *p = arr[i];
[p say];
}
- NSArray的快速遍历
NSArray *arr = @[p1, p2, p3, p4, p5];
for (Person *p in arr) {
[p say];
}
- NSArray 使用block进行遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"obj = %@, idx = %lu", obj, idx);
Person *p = obj;
[p say];
}];
- NSArray给所有元素发消息
- 让集合里面的所有元素都执行aSelector这个方法
- - (void)makeObjectsPerformSelector:(SEL)aSelector;
- - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
- 让集合里面的所有元素都执行aSelector这个方法
NSArray排序
- Foundation自带类排序
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
- 自定义类排序
NSArray *arr = @[p1, p2, p3, p4, p5];
// 默认按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
return obj1.age > obj2.age;
}];
NSLog(@"%@", newArr);
NSArray文件读写
- NSArray数据写入到文件中
NSArray *arr = @[@"ldj", @"lqj", @"jjj", @"xwq"];
BOOL flag = [arr writeToFile:@"/Users/guo/Desktop/persons.plist" atomically:YES];
NSLog(@"%i", flag);
- 从文件中读取数据到NSArray中
NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/guo/Desktop/persons.xml"];
NSLog(@"%@", newArr);
NSArray 与字符串
- 把数组元素链接成字符串
- - (NSString )componentsJoinedByString:(NSString )separator;
- 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
- - (NSString )componentsJoinedByString:(NSString )separator;
NSArray *arr = @[@"ldj", @"lq", @"jjj", @"xwq"];
NSString *res = [arr componentsJoinedByString:@"*"];
NSLog(@"res = %@", res);
输出结果:
ldj*lq*jjj*xwq
- 字符串分割方法
- - (NSArray )componentsSeparatedByString:(NSString )separator;
- 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
- - (NSArray )componentsSeparatedByString:(NSString )separator;
NSString *str = @"lj-qj-jj-gj";
NSArray *arr = [str componentsSeparatedByString:@"-"];
NSLog(@"%@", arr);
输出结果:
(
lj,
lj,
jj,
gj
)
NSArray文件读写
- NSArray数据写入到文件中
NSArray *arr = @[@"lj", @"qj", @"jj", @"gj"];
BOOL flag = [arr writeToFile:@"/Users/guo/Desktop/persons.plist" atomically:YES];
NSLog(@"%i", flag);
- 从文件中读取数据到NSArray中
NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/guo/Desktop/persons.xml"];
NSLog(@"%@", newArr);
五 NSMutableArray
什么是NSMutableArray
- NSMutableArray是NSArray的子类
- NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
- NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
NSMutableArray基本用法
- 创建空数组
NSMutableArray *arr = [NSMutableArray array];
- 创建数组,并且指定长度为5,此时也是空数组
NSMutableArray *arr2 = [[NSMutableArray alloc] initWithCapacity:5];
- 创建一个数组,包含两个元素
NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
- 调用对象方法创建数组
NSMutableArray *arr4 = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
- (void)addObject:(id)object;
- 添加一个元素
- (void)addObjectsFromArray:(NSArray *)array;
- 添加otherArray的全部元素到当前数组中
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- 在index位置插入一个元素
- (void)removeLastObject;
- 删除最后一个元素
- (void)removeAllObjects;
- 删除所有的元素
- (void)removeObjectAtIndex:(NSUInteger)index;
- 删除index位置的元素
- (void)removeObject:(id)object;
- 删除特定的元素
- (void)removeObjectsInRange:(NSRange)range;
- 删除range范围内的所有元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
- 用anObject替换index位置对应的元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
- 交换idx1和idx2位置的元素
注意:不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误
六 NSDictionary
什么是NSDictionary
- NSDictionary翻译过来叫做”字典”
- NSDictionary的作用类似:通过一个key,就能找到对应的value
- NSDictionary是不可变的, 一旦初始化完毕, 里面的内容就无法修改
NSDictionary的创建
+ (instancetype)dictionary;
+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
- NSDictionary创建简写
// 以前
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"xx", @"name", @"12345678", @"phone", @"天朝", @"address", nil];
// 现在
NSDictionary *dict = @{@"name":@"GUO", @"phone":@"12345678", @"address":@"天朝"};
- NSDictionary获取元素简写
[dict objectForKey:@"name”];
// 简写
dict[@"name”];
键值对集合的特点
- 字典存储的时候,必须是”键值对”的方式来存储(同时键不要重复)
- 键值对中存储的数据是”无序的”
- 键值对集合可以根据键, 快速获取数据
NSDictionary的遍历
- (NSUInteger)count;
- 返回字典的键值对数目
- (id)objectForKey:(id)aKey;
- 根据key取出value
快速遍历
NSDictionary *dict = @{@"name":@"xx", @"phone":@"12345678", @"address":@"天朝"};
for (NSString *key in dict) {
NSLog(@"key = %@, value = %@", key, dict[key]);
}
- Block遍历
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
NSLog(@"key = %@, value = %@", key, obj);
}];
NSDictionary文件操作
将字典写入文件中
- - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
- 存结果是xml文件格式,但苹果官方推荐为plist后缀。
从文件中读取字典
NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/guo/Desktop/dict.plist"];
NSLog(@"newDict = %@", newDict);
七 NSMutableDictionary
什么是NSMutableDictionary
- NSMutableDictionary是NSDictionary的子类
- NSDictionary是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素, 也不能再往里面添加元素
- NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
NSMutableDictionary的常见操作
- (void)setObject:(id)anObject forKey:(id )aKey;
- 添加一个键值对(会把aKey之前对应的值给替换掉)
- (void)removeObjectForKey:(id)aKey;
- 通过aKey删除对应的value
- (void)removeAllObjects;
- 删除所有的键值对
NSMutableDictionary的简写
- 设置键值对
[dict setObject:@"Jack" forKey:@"name”];
// 简写
dict[@"name"] = @"Jack";
- NSArray和NSDictionary的区别
- NSArray是有序的,NSDictionary是无序的
- NSArray是通过下标访问元素,NSDictionary是通过key访问元素
八 常见的结构体
- 1.NSPoint和CGPoint
typedef CGPoint NSPoint;
CGPoint的定义
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
CGPoint代表的是二维平面中的一个点
- 可以使用CGPointMake和NSMakePoint函数创建CGPoint
2.NSSize和CGSize
typedef CGSize NSSize;
CGSize的定义
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
- 可以使用CGSizeMake和NSMakeSize函数创建CGSize
3.NSRect和CGRect
typedef CGRect NSRect;
CGRect的定义
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
- CGRect代表的是二维平面中的某个物体的位置和尺寸
- 可以使用CGRectMake和NSMakeRect函数创建CGRect
九 NSNumber
NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类
如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象
NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
NSNumber的创建
以前:
- + (NSNumber *)numberWithInt:(int)value;
- + (NSNumber *)numberWithDouble:(double)value;
- + (NSNumber *)numberWithBool:(BOOL)value;
现在简写:
- @10;
- @10.5;
- @YES;
从NSNumber对象中的到基本类型数据
- - (char)charValue;
- - (int)intValue;
- - (long)longValue;
- - (double)doubleValue;
- - (BOOL)boolValue;
- - (NSString *)stringValue;
- - (NSComparisonResult)compare:(NSNumber *)otherNumber;
- - (BOOL)isEqualToNumber:(NSNumber *)number;
十 NSValue
- NSValue基本概念
- NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
- NSValue可以包装任意值
常见结构体的包装
- 将结构体包装成NSValue对象
- + (NSValue *)valueWithPoint:(NSPoint)point;
- + (NSValue *)valueWithSize:(NSSize)size;
- + (NSValue *)valueWithRect:(NSRect)rect;
- 从NSValue对象取出之前包装的结构体
- - (NSPoint)pointValue;
- - (NSSize)sizeValue;
- - (NSRect)rectValue;
- 将结构体包装成NSValue对象
NSValue提供了下列方法来包装任意数据
+ (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;
- value参数 : 所包装数据的地址
- type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
从NSValue中取出所包装的数据
- - (void)getValue:(void *)value;
十 NSDate
NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理
- 一个NSDate对象就代表一个时间
- [NSDate date]返回的就是当前时间
NSDate *now = [NSDate date];
NSLog(@"now = %@", now);
// 设置转换后的目标日期时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];
// 得到源日期与世界标准时间的偏移量
NSInteger interval = [zone secondsFromGMTForDate: date];
NSLog(@"interval = %lu", interval);
// 在当前时间基础上追加时区差值
now = [now dateByAddingTimeInterval:interval];
NSLog(@"%@", date);
格式化日期
- NSDate -> NSString
// 1.创建时间 NSDate *now = [NSDate date]; // 2.创建时间格式化 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 3.指定格式 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; // 4.格式化时间 NSString *str = [formatter stringFromDate:now]; NSLog(@"%@", str);
- NSString -> NSDate
NSString *str = @"2015-06-28 19:53:24"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; NSDate *date = [formatter dateFromString:str]; NSLog(@"%@", date);
结合NSCalendar和NSDate能做更多的日期\时间处理
- 获得NSCalendar对象
NSCalendar *calendar = [NSCalendar currentCalendar];
- 获得年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
NSDate *date = [NSDate date];
// 1.创建日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 2.利用日历对象获取年月日时分秒
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *cmps =[calendar components:type fromDate:date];
NSLog(@"year = %lu", cmps.year);
NSLog(@"month = %lu", cmps.month);
NSLog(@"day = %lu", cmps.day);
NSLog(@"hour = %lu", cmps.hour);
NSLog(@"minute = %lu", cmps.minute);
NSLog(@"second = %lu", cmps.second);
NSLog(@"date = %@", date);
- 比较两个日期的差距
- - (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
// 1.确定时间
NSString *time1 = @"2015-06-23 12:18:15";
NSString *time2 = @"2015-06-28 10:10:10";
// 2.将时间转换为date
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [formatter dateFromString:time1];
NSDate *date2 = [formatter dateFromString:time2];
// 3.创建日历
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
// 4.利用日历对象比较两个时间的差值
NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
// 5.输出结果
NSLog(@"两个时间相差%ld年%ld月%ld日%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);
十一 NSFileManager
什么是NSFileManager
NSFileManager是用来管理文件系统的,它可以用来进行常见的文件\文件夹操作
NSFileManager使用了单例模式
- 使用defaultManager方法可以获得那个单例对象
[NSFileManager defaultManager]
NSFileManager用法
- - (BOOL)fileExistsAtPath:(NSString *)path;
- path这个文件\文件夹是否存在
NSFileManager *manager = [NSFileManager defaultManager]; // 可以判断文件 BOOL flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/GUO.txt"]; NSLog(@"flag = %i", flag); // 可以判断文件夹 flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/未命名文件夹"]; NSLog(@"flag = %i", flag);
- - (BOOL)fileExistsAtPath:(NSString )path isDirectory:(BOOL )isDirectory;
- path这个文件\文件夹是否存在, isDirectory代表是否为文件夹
NSFileManager *manager = [NSFileManager defaultManager]; BOOL directory = NO; BOOL flag = [manager fileExistsAtPath:@"/Users/GUO/Desktop/未命名文件夹" isDirectory:&directory]; NSLog(@"flag = %i, directory = %i", flag, directory);
- (BOOL)isReadableFileAtPath:(NSString *)path;
- path这个文件\文件夹是否可读
- (BOOL)isWritableFileAtPath:(NSString *)path;
- path这个文件\文件夹是否可写
- 系统目录不允许写入
- (BOOL)isDeletableFileAtPath:(NSString *)path;
- path这个文件\文件夹是否可删除
- 系统目录不允许删除
- - (BOOL)fileExistsAtPath:(NSString *)path;
NSFileManager的文件访问
- - (NSDictionary )attributesOfItemAtPath:(NSString )path error:(NSError **)error;
- 获得path这个文件\文件夹的属性
NSFileManager *manager = [NSFileManager defaultManager]; NSDictionary *dict = [manager attributesOfItemAtPath:@"/Users/guo/Desktop/guo.txt" error:nil]; NSLog(@"dit = %@", dict);
- (NSArray )contentsOfDirectoryAtPath:(NSString )path error:(NSError **)error;
- 获得path的当前子路径
NSFileManager *manager = [NSFileManager defaultManager]; NSArray *paths = [manager contentsOfDirectoryAtPath:@"/Users/guo/Desktop/" error:nil]; NSLog(@"paths = %@", paths);
- 获得path的当前子路径
- (NSData )contentsAtPath:(NSString )path;
- 获得文件内容
- - (NSDictionary )attributesOfItemAtPath:(NSString )path error:(NSError **)error;
- (NSArray )subpathsAtPath:(NSString )path;
- - (NSArray )subpathsOfDirectoryAtPath:(NSString )path error:(NSError **)error;
- 获得path的所有子路径
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *paths = [manager subpathsAtPath:@"/Users/guo/Desktop/"];
NSLog(@"paths = %@", paths);
- NSFileManager的文件操作
// 拷贝
- (BOOL)copyItemAtPath:(NSString **)srcPath toPath:(NSString **)dstPath error:(NSError **)error;
// 移动(剪切)
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
// 删除
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
// 创建文件夹(createIntermediates为YES代表自动创建中间的文件夹)
NSFileManager *manager = [NSFileManager defaultManager];
BOOL flag = [manager createDirectoryAtPath:@"/Users/guo/Desktop/test" withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"flag = %i", flag);
- - (BOOL)createFileAtPath:(NSString )path contents:(NSData )data attributes:(NSDictionary *)attr;
- 创建文件(NSData是用来存储二进制字节数据的)
NSString *str = @"xx";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSFileManager *manager = [NSFileManager defaultManager];
BOOL flag = [manager createFileAtPath:@"/Users/guo/Desktop/abc.txt" contents:data attributes:nil];
NSLog(@"flag = %i", flag);