iOS开发--Foundation框架
Foundation框架介绍
-
什么是框架?
- 众多功能\API的集合
- 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易,在OS X下的Mac操作系统中大约有80个框架,为所有程序开发奠定基础的框架称为Foundation 框架
-
Foundation框架的作用
- Foundation框架是Mac\iOS中其他框架的基础
- Foundation框架包含了很多开发中常用的数据类型:
- 结构体
- 枚举
- 类
-
如何使用Foundation框架
- Foundation框架中大约有125个可用的头文件,作为一个简单的形式,可以简单地使用以下语句导入#import因为Foundation.h文件实际上导入其他所有Foundation框架中的头文件
-
Foundation框架中的类
-
Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)
-
Foundation框架提供了非常多好用的类, 比如
NSString : 字符串 NSArray : 数组 NSDictionary : 字典 NSDate : 日期 NSData : 数据 NSNumber : 数字
-
-
Foundation框架中的类都是以NS为前缀(Next Step的缩写)
NSString基本概念
直接读写文件中的字符
- 从文件中读取
// 用来保存错误信息
NSError *error = nil;
//路径
NSString *path = @"/Users/gaoxiong/Data/GaoCode/CPractcies/Day17/文件读写/gx.txt";
// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
// 如果有错误信息
if (error) {
NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
} else { // 如果没有错误信息
NSLog(@"读取成功, 文件内容是:\n%@", str);
}
- 写入文件中
NSString *str = @"gx";
// atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件
// 如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
BOOL flag = [str writeToFile:@"/Users/gaoxiong/Desktop/gx.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
{
NSLog(@"写入成功");
}
- 注意:重复写入同一文件会覆盖掉上一次的内容
NSURL
-
URL的格式
- 基本URL包含协议、主机域名(服务器名称\IP地址)、路径
- 可以简单认为: URL == 协议头://主机域名/路径
-
常见的URL协议头(URL类型)
- http://和https:// :超文本传输协议资源, 网络资源
- ftp:// :文件传输协议
- file:// :本地电脑的文件
-
URL的创建
-
传入完整的字符串创建
NSURL *url = [NSURL URLWithString:@"file:///Users/gx/Desktop/str.txt"];
-
通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/gx/Desktop/str.txt"];
-
- URL中读取和写入
//保存错误信息
NSError *error = nil;
//本机地址省略主机域名
NSString *path = @"file:///Users/gaoxiong/Desktop/gx.txt";
//方法一:URLWithString
NSURL *url = [NSURL URLWithString: path];
//读取指定URL文件信息
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
//输出
NSLog(@"%@",str);
//URL中带有中文
NSString *path2 = @"file:///Users/gaoxiong/Desktop/齐天大圣/zbj.txt";
//对中文进行百分号编码
path2 = [path2 stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]];
//创建URL:URLWithString
NSURL *url2 = [NSURL URLWithString:path2];
//读取
NSString *str2 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:&error];
//输出
NSLog(@"%@",str2);
//方法二:fileURLWithPath,方法中包含t协议头file://
NSURL *url3 = [NSURL fileURLWithPath:@"/Users/gaoxiong/Desktop/齐天大圣/zbj.txt"];
NSString *str4 = [NSString stringWithContentsOfURL:url3 encoding:NSUTF8StringEncoding error:&error];
//判断读取成功之后输出
if (error) {
NSLog(@"读取失败,错误原因是:%@",[error localizedDescription]);
}else{
NSLog(@"读取成功,文件内容是:\n%@",str4);
}
//写入URL
NSString *str5 = @"西风烈,长空雁叫霜晨月。霜晨月,马蹄声碎,喇叭声咽;雄关漫道真如铁,而今迈步从头越。从头越,苍山如海,残阳如血。";
[str5 writeToURL:url3 atomically:YES encoding:NSUTF8StringEncoding error: nil];
如果访问本机资源,创建URL的时候,建议使用fileURLWithPath方法创建
URL不支持中文,如果URL中包含中文,那么无法访问;
但是如果通过fileURLWithPath方法创建URL,系统内部会自动对URL中的中文进行处理,可以访问.
如果URL中包含中文,又不能通过fileURLWithPath创建,则必须在创建URL之前相对字符串进行中文处理,进行百分号编码
stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]
2.NSRange基本概念
- NSRange是Foundation框架中比较常用的结构体, 它的定义如下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
// NSUInteger的定义
typedef unsigned int NSUInteger;
- NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
- NSRange有2个成员
- NSUInteger location : 表示该范围的起始位置(从0开始计算)
- NSUInteger length : 表示该范围内的长度
3.NSRange的创建
- 有3种方式创建一个NSRange变量
- 方式1
NSRange range;
range.location = 7;
range.length = 3;
1.字符串的截取
//字符串截取:substringWithRange
NSString *str = @"<head>iPhone</head>";
//OC提供的结构体,一般都可以t用NSMAKEXXX来创建
// NSRange range = NSMakeRange(6, 6);
//1.动态获取截取的起止位置
NSUInteger location = [str rangeOfString:@">"].location + 1;
//2.动态获取截取长度
//2.1反向查找
// NSUInteger length = [str rangeOfString:@"<" options:NSBackwardsSearch].location -location;
//2.2正向查找
NSUInteger length = [str rangeOfString:@"</"].location -location;
NSLog(@"\nlocation = %lu, length = %lu", location, length);
NSRange range = NSMakeRange(location, length);
NSString *newStr = [str substringWithRange:range];
NSLog(@"newStr = %@",newStr);
//字符串截取2:- (NSString *)substringFromIndex:(NSUInteger)from;
//字符串截取3:- (NSString *)substringToIndex:(NSUInteger)to;
//截取过程:<head>iPhone</head>--->iPhone</head>---->iPhone
NSLog(@" str = %@", str);
NSUInteger location2 = [str rangeOfString:@">"].location + 1;
NSString *newstr2 = [str substringFromIndex:location2];
NSLog(@"newStr2 = %@",newstr2);
location2 = [newstr2 rangeOfString:@"</"].location ;
newstr2 = [newstr2 substringToIndex:location2];
NSLog(@"newStr2 = %@", newstr2);
/* 输出
location = 6, length = 6
newStr = iPhone
str = <head>iPhone</head>
newStr2 = iPhone</head>
newStr2 = iPhone
*/
字符串替换
NSString *str = @" www.baidu.com ";
NSLog(@"str = %@", str);
//字符串替换
//- (NSString)stringByReplacingOccurrencesOfString:(NSString )target withString:(NSString *)replacement;
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"baidu" withString:@"30414
NSLog(@"newStr = %@", newStr);
//去除首位空格: whitespaceCharacterSet
//- (NSString)stringByTrimmingCharactersInSet:(NSCharacterSet)set;
NSCharacterSet *set = NSCharacterSet.whitespaceCharacterSet;
newStr = [newStr stringByTrimmingCharactersInSet:set];
NSLog(@"newStr = |%@|", newStr);
//去除首尾某个字符: characterSetWithCharactersInString
NSString *str1 = @"***http://www.china.***com***";
NSLog(@"str1 = %@", str1);
NSString *newStr1 = [str1 stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]];
NSLog(@"newStr1 = %@", newStr1);
/*
输出结果:
str = www.baidu.com
newStr = www.qq.com
newStr = |www.qq.com|
str1 = ***http://www.china.***com***
newStr1 = http://www.china.***com
*/
字符串与路径、扩展名
//NSString与路径PathComponent
//1.判断是否是一个绝对路径:isAbsolutePath
//本质:判断是否以 / 开头
NSString *str = @"/Users/gaoxiong/Desktop/gx.txt";
if ([str isAbsolutePath]) {
NSLog(@"是一个绝对路径");
}else{
NSLog(@"不是一个绝对路径");
}
//2.获取文件路径最后一个目录:lastPathComponent
//本质:获取最后一个 / 之后的文件名
NSString *newStr = [str lastPathComponent];
NSLog(@"%@", newStr);
//3.删除文件路径中的最后一个路径:stringByDeletingPathExtension
//文件有扩展名只删除了扩展名
newStr = [str stringByDeletingPathExtension];
NSLog(@"%@", newStr);
//4.在文件路径最后增加一个目录
//本质:在字符串的末尾加上一个 / 和指定内容
//自动判断更改路径格式:只保留一个/
newStr = [newStr stringByAppendingPathComponent:@"/txt"];
NSLog(@"%@", newStr);
//文件与扩展名PathExtension
NSString *str1 = @"/Users/gaoxiong/Desktop/gx.txt";
//1.获取文件扩展名:pathExtension
newStr = [str1 pathExtension];
NSLog(@"%@", newStr);
//2.删除文件扩展名:stringByDeletingPathExtension
str1 = [str1 stringByDeletingPathExtension];
NSLog(@"%@", str1);
//3.添加扩展名
str1 = [str1 stringByAppendingPathExtension:@".txt"];
NSLog(@"%@", str1);
字符串与基本数据类型转换
//返回index对应位置的字符:characterAtIndex:(NSUInteger) index
NSString *str = @"I love peace!";
unichar c = [str characterAtIndex:0];
NSLog(@"%c", c);
//字符串长度length属性
NSUInteger length = str.length;
NSLog(@"length = %lu", length);
//字符串转换为基本数据类型
NSString *str1 = @"12";
NSUInteger num = [str1 intValue];
double d = [str1 doubleValue];
float f = [str1 floatValue];
int i = [str1 intValue];
NSLog(@"nsuinteger = %lu, float = %f, double = %lf, int = %i ", num, f, d, i);
//NSString转换为C语言字符串
const char *cStr = [str UTF8String];
NSLog(@"%s", cStr);
//C语言字符串转换为NSString
NSString *str2 = [NSString stringWithUTF8String:cStr];
NSLog(@"%@", str2);
NSMutableString基本概念
-
NSMutableString和NSString的区别
- NSString是不可变的, 里面的文字内容是不能进行修改的
- NSMutableString是可变的, 里面的文字内容可以随时更改
- NSMutableString能使用NSString的所有方法
NSMutableString常用方法
1.NSMutableString常用方法
//多种初始化方式
NSMutableString *strM = [[NSMutableString alloc] init];
NSMutableString *strM2 = [NSMutableString stringWithFormat:@"abc"];
NSMutableString *strM3 = [NSMutableString stringWithString:@"www.qq.com"];
//增加: appendString
[strM appendString:@"zhubajie"];
NSLog(@"%@", strM);
//增加:appendFormat
[strM appendFormat:@" is lulu "];
NSLog(@"%@", strM);
//删除
//在开发中经常使用rangeOfString和deleteCharactersInRange配合删除指定字符串
NSRange range = [strM3 rangeOfString:@"www."];
[strM3 deleteCharactersInRange:range];
NSLog(@"%@", strM3);
//插入
[strM2 insertString:@"520" atIndex:0];
NSLog(@"%@", strM2);
[strM insertString:@"zhubajie" atIndex:0];
//修改
//count: 替换数量
//options:搜索方式
//range:搜索范围
NSUInteger count = [strM replaceOccurrencesOfString:@"zhubajie" withString:@"xiaokeai" options:0 range:NSMakeRange(0, strM.length)];
NSLog(@"%@,\ncount = %lu",strM,count);
2.字符串使用注意事项
- @”gx”这种方式创建的字符串始终是NSString,不是NSMutalbeString.所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。
NSMutalbeString *s1 = @”gx”;
// 会报错
[strM insertString:@"my name is " atIndex:
1.NSArray的基本概念
-
C语言中数组的弊端
- int array[4] = {10, 89, 27, 76};
- 只能存放一种类型的数据.(类型必须一致)
- 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)
-
NSArray的使用注意
- 只能存放任意OC对象, 并且是有顺序的
- 不能存储非OC对象, 比如int\float\double\char\enum\struct等
- 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
2.NSArray的创建方式和使用
//NSArray 创建方式
NSURL *url = [NSURL fileURLWithPath:@"/Users/gaoxiong/Desktop/gx.txt"];
Person *lulu = [Person personWithName:@"璐璐"];
NSObject *obj = [NSObject new];
NSArray *arr = [[NSArray alloc] initWithObjects:lulu,obj, nil];
NSArray *arr2 = [NSArray arrayWithObject:@"Lulu"];
NSArray *arr3 = [NSArray arrayWithObjects:@"gx",@"pig",@"xiaokeai", nil];
NSArray *arr4 = [NSArray arrayWithContentsOfURL:url];
//数组的文件导入
NSArray *arr5 = [NSArray arrayWithContentsOfFile:@"/Users/gaoxiong/Desktop/gx.plist"];
NSArray *arr6 = [NSArray arrayWithArray:arr3];
//数组的文件导出
//writeToFile 只能导出Foundation框架里的类, 自定义的类导出失败.需要用其他方法
NSArray *arr7 = [NSArray arrayWithObjects:@"zhubajie",@"sunwukong",@"tangsanzang",@"shawujing", @"齐天大圣",nil];
BOOL flag0 = [arr7 writeToFile:@"/Users/gaoxiong/Desktop/gx.xml" atomically:YES];
NSLog(@"flag0 = %i", flag0);
NSLog(@"arr4 = %@",arr4);
NSLog(@"arr5 = %@",arr5);
NSLog(@"arr6 = %@",arr6);
//使用
//集合元素的个数
NSUInteger count = arr3.count;
NSLog(@"count = %lu", count);
//获取index位置的元素
id obj2 = [arr2 objectAtIndex:0];
NSLog(@"%@",obj2);
//是否包含某个元素
BOOL flag = [arr containsObject:lulu];
NSLog(@"%i", flag);
//返回最后一个元素
id last = [arr5 lastObject];
NSLog(@"last = %@", last);
//返回第一个元素
id first = [arr7 firstObject];
NSLog(@"first = %@", first);
//查找anObject元素在数组中的位置(如果找不到,返回-1)
NSUInteger index = [arr7 indexOfObject:@"sunhukong"];
NSLog(@"index = %lu", index);
//在range范围内查找anObject元素在数组中的位置
NSUInteger index2 = [arr7 indexOfObject:@"choubaguai" inRange:NSMakeRange(0, 3)];
NSLog(@"index2 = %lu", index2);
3.NSArray 的使用注意事项
- NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。
- NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。
NSArray *arr = [NSArray arrayWithObjects:@"gx", nil ,@"lulu", nil];
NSLog(@"%@", arr);
输出结果:
(
gx
)
4.NSArray的简写形式
-
自从2012年开始, Xcode的编译器多了很多自动生成代码的功能, 使得OC代码更加精简
-
数组的创建:
@[@"Jack", @"Rose", @"Jim"];
-
数组元素的访问:
array[0];
NSArray 遍历
//下标遍历
NSArray *arr = [NSArray arrayWithContentsOfFile:@"/Users/gaoxiong/Desktop/gx.txt"];
for (int i = 0; i < arr.count; i++) {
NSString *str = arr[I];
NSLog(@"arr[%i] = %@", i, str);
}
//快速遍历
Person *p1 = [Person personWithName:@"大头"];
Person *p2 = [Person personWithName:@"大大头"];
Person *p3 = [Person personWithName:@"大大大头"];
Person *p4 = [Person personWithName:@"大大大大头"];
Person *p5 = [Person personWithName:@"大大大大大头"];
//OC数组使用增强for循环
//逐个取出集合中元素,赋值给 *p
NSArray *arr2 = @[p1, p2, p3, p4, p5];
for (Person *p in arr2) {
[p say];
}
//OC数组迭代器来遍历
//使用block遍历
//每取出一个元素调用一次block
//每次调用block都会将元素及其index传递给我们
//obj 代表当前元素, idx就是当前索引
//stop 是控制循环结束
[arr2 enumerateObjectsUsingBlock:^(Person *obj, NSUInteger idx, BOOL *stop){
if (idx == 1) {
*stop = YES;
}
Person *p = obj;
[p say];
}];
//让所有元素执行同一方法(给所有元素发消息)
[arr2 makeObjectsPerformSelector:@selector(say)];
[arr2 makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"八戒!"];
NSArray排序
//Foundation排序
//sortedArrayUsingSelector compare: 必须是oc对象
NSArray *arr = @[@10, @20, @30, @40, @9];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序前: \n%@", arr);
NSLog(@"排序后: \n%@", newArr);
//自定义排序
//按照人的年龄排序
Person *p1 = [Person personWithName:@"大头" andAge:10];
Person *p2 = [Person personWithName:@"大大头" andAge:30];
Person *p3 = [Person personWithName:@"大大大头" andAge:20];
Person *p4 = [Person personWithName:@"大大大大头" andAge:9];
Person *p5 = [Person personWithName:@"大大大大大头" andAge:8];
NSArray *arr2 = @[p1,p2,p3,p4,p5];
NSArray *newArr2 =[arr2 sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1,Person *obj2) {
return obj1.age < obj2.age;
}];
NSLog(@"排序前:%@", arr2);
NSLog(@"排序后:%@", newArr2);
NSArray 与字符串
//数组转字符串componentsJoinedByString
NSArray *arr = [NSArray arrayWithObjects:@"zhubajie",@"sunhukong",@"tangsanzang",@"shawujing", @"齐天大圣",nil];
NSString *str = [arr componentsJoinedByString:@"-"];
NSLog(@"str = %@", str);
//字符串切割(字符串转数组)componentsSeparatedByString
NSArray *newAra = [str componentsSeparatedByString:@"-"];
NSLog(@"%@", newAra);
NSMutableArray基本概念
1.NSMutableArray介绍
- 什么是NSMutableArray
- NSMutableArray是NSArray的子类
- NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
- NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
2.NSMutableArray基本用法
//NSMUtableArray的创建方式
NSMutableArray *arrM0 = [NSMutableArray arrayWithObjects:@"ll",@"ww",@6, nil];
//创建一个空的可变数组
NSMutableArray *arrM = [NSMutableArray array];
//添加元素
[arrM addObject:@"gx"];
[arrM addObjectsFromArray:@[@"lkl", @"hxh"]];
//将整个数组当作一个元素添加到数组
[arrM addObject:@[@"lkl", @"hxh"]];
//插入元素
[arrM insertObject:@"NNNNNN" atIndex:0];
NSLog(@"%@",arrM);
[arrM insertObjects:arrM0 atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)]];
NSLog(@"%@",arrM);
//如何删除
[arrM removeObject:@"NNNNNN"];
[arrM removeObjectAtIndex:1];
[arrM removeLastObject];
NSLog(@"%@", arrM);
//替换
[arrM replaceObjectAtIndex:1 withObject:@"xx"];
//简单写法
arrM[0] = @"gg";
NSLog(@"%@", arrM);
//交换
[arrM exchangeObjectAtIndex:0 withObjectAtIndex:1];
NSLog(@"%@", arrM);
3.NSMutableArray 错误用法
- 不可以使用@[]创建可变数组
NSMutableArray *array = @[@"gx", @"璐璐", @"jjj"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];
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 = @{@"name":@"gx", @"phone":@"12345678", @"address":@"天朝"};
-
NSDictionary获取元素简写
dict[@"name”];
-
键值对集合的特点
- 字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复)
- 键值对中存储的数据是"无序的".
- 键值对集合可以根据键, 快速获取数据.
//1.如何创建dictionaryWithObject:forKey:
NSDictionary *dict0 = [NSDictionary dictionaryWithObject: @"gx" forKey:@"name"];
NSString *name = [dict0 objectForKey:@"name"];
NSLog(@"name = %@", name);
//创建dictionaryWithObjects:forKeys:
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:@[@"gx", @"18", @"1.85"] forKeys:@[@"name", @"ages", @"height"]];
NSLog(@"%@, %@, %@",[dict1 objectForKey:@"name"], [dict1 objectForKey:@"ages"], [dict1 objectForKey:@"height"]);
//快速创建
NSDictionary *dict2 = @{@"name":@"gx",@"ages":@"18", @"height":@"1.85"};
NSLog(@"%@, %@, %@",dict2[@"name"], dict2[@"ages"], dict2[@"height"]);
//2.字典的遍历
//2.1获取字典中的key(键)和value(值)的个数
NSDictionary *dict3 = @{@"name":@"gx",@"ages":@"18", @"height":@"1.85"};
for (int i = 0; i < dict3.count; i++) {
NSArray *keys = [dict3 allKeys];
NSString *key = keys[I];
NSString *value = dict3[key];
NSLog(@"key = %@, value = %@", key, value);
//2.2forIn遍历字典,将所有的key赋值给前面的Obj
for (NSString *key in dict3) {
NSLog(@"%@", key);
NSString *value = dict3[key];
NSLog(@"key = %@, value = %@", key, value);
}
//2.3迭代器Block
[dict3 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"key = %@, value = %@", key, value);
}];
//3.字典文件读写
[dict3 writeToFile:@"/Users/gaoxiong/Desktop/GXInfo.plist" atomically:YES];
NSDictionary *dict4 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/gaoxiong/Desktop/GXInfo.plist"];
NSMutableDictionary
//1.创建一个空的字典
NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
NSLog(@"%@", dictM);
//2.添加
[dictM setObject:@"gx" forKey:@"name"];
//2.1简写
dictM[@"ages"] = @"18";
//3.获取
NSLog(@"name = %@", dictM[@"name"] );
//4.删除
[dictM removeObjectForKey:@"ages"];
//4.1多个删除
[dictM removeObjectsForKeys:@[@"ages", @"name"]];
//5.修改
[dictM setObject:@"19" forKey:@"ages"];
/******************************注意*****************************/
//1.不能用@{}来创建一个可变的字典
//2.如果是不可变数组,那么key不能相同
//2.1在不可变数组中出现同名的key,那么后面的key不会保存
//2.2在可变数组中出现同名的key,那么后面的key会覆盖前面的key
2.NSDictionary和NSArray对比
-
NSArray和NSDictionary的区别
-
NSArray是有序的,NSDictionary是无序的
-
NSArray是通过下标访问元素,NSDictionary是通过key访问元素
-
NSArray的用法
-
创建
@[@"Jack", @"Rose"] (返回是不可变数组)
-
访问
id d = array[1];
-
赋值
array[1] = @"jack";
-
-
NSDictionary的用法 +创建
@{ @"name" : @"Jack", @"phone" : @"10086" } (返回是不可变字典)
-
访问
id d = dict[@"name"];
-
赋值
dict[@"name"] = @"jack";
-
常见的结构体
1.NSPoint和CGPoint
- CGPoint和NSPoint是同义的
typedef CGPoint NSPoint;
CGPoint的定义
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
- CGPoint代表的是二维平面中的一个点
- 可以使用CGPointMake和NSMakePoint函数创建CGPoint
2.NSSize和CGSize
- CGSize和NSSize是同义的
typedef CGSize NSSize;
CGSize的定义
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
- CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
- 可以使用CGSizeMake和NSMakeSize函数创建CGSize
3.NSRect和CGRect
- CGRect和NSRect是同义的
typedef CGRect NSRect;
CGRect的定义
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
- CGRect代表的是二维平面中的某个物体的位置和尺寸
- 可以使用CGRectMake和NSMakeRect函数创建CGRect
4.常见的结构体使用注意
- 苹果官方推荐使用CG开头的:
- CGPoint
- CGSize
- CGRect
NSNumber
1.NSNumber基本概念
- NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类
- 如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象
- NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
2.NSNumber的创建
- 以前
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
-
现在 (传入的变量,必须加圆括号,不能省略)
@10; @10.5; @YES; @(num) //传入的变量,必须加圆括号,不能省略
3.NSNumber对象转换
- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
- (NSComparisonResult)compare:(NSNumber *)otherNumber;
- (BOOL)isEqualToNumber:(NSNumber *)number;
NSValue
1.NSValue基本概念
- NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
- NSValue可以包装任意值
- 因此, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中
2. 常见结构体的包装
- 为了方便 结构体 和NSValue的转换,Foundation提供了以下方法
- 将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
- 从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
3.任意数据的包装
-
NSValue提供了下列方法来包装任意数据
- (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
- value参数 : 所包装数据的地址
- type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
-
从NSValue中取出所包装的数据
- (void)getValue:(void *)value;
typedef struct {
int age;
char *name;
double height;
}person;
person p1 = {10 ,"gx", 1.85};
//自定义结构体转NS对象
NSValue *pValue = [NSValue valueWithBytes:&p1 objCType:@encode(person)];
NSArray *arr = @[pValue];
NSLog(@"%@", arr);
//取出nNSValue的值
person res;
[pValue getValue:&res];
NSLog(@"age = %i, name = %s, height = %0.2f", res.age, res.name, res.height);
NSDate
//1.NSDate创建和基本概念
NSDate *now = [NSDate date];//获取当前时间
NSLog(@"now = %@", now);
//在now基础上追加多少秒
NSDate *date = [now dateByAddingTimeInterval:10];
NSLog(@"date = %@", date);
//获取所在时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];
//获取当前时区和指定时间的时间差
NSInteger seconds = [zone secondsFromGMTForDate:now];
NSLog(@"seconds = %lu", seconds);
//2.时间格式化
//xxxx年xx月xx日 xx小时xx分钟xx秒
//xxxx/xx/xx xx/xx/xx
//2.1创建一个时间格式化对象
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//2.2格式(大MM小dd)
formatter.dateFormat = @"YYYY年MM月dd日 z hh时mm分钟ss秒 ";
NSString *res =[formatter stringFromDate:now];
NSLog(@"res = %@", res);
//2.3字符串转NSDate
NSString *str = @"2019-04-28 GMT+8 19:25:00";
NSDateFormatter *f2 = [NSDateFormatter new];
f2.dateFormat = @"yyyy-MM-dd z hh:mm:ss";
NSDate *date2 = [f2 dateFromString:str];
//默认时间格式
NSLog(@"date2 = %@", date2);
//修改时间格式
NSString *res2 = [f2 stringFromDate:date2];
NSLog(@"res2 = %@", res2);
3.日期时间对象
- 结合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(@"cmps = %@", cmps);
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 *fm1 = [NSFileManager defaultManager];
NSFileManager *fm2 = [NSFileManager defaultManager];
NSLog(@"%p %p", &fm1, &fm2);
//1.判断一个文件夹是否存在
BOOL flag = [fm1 fileExistsAtPath:@"/Users/gaoxiong/Desktop/gx.plist"];
NSLog(@"flag = %i", flag);
//2.判断一个文件是否存在,并判断是否是文件夹
BOOL dir = NO;
BOOL flag1 = [fm1 fileExistsAtPath:@"/Users/gaoxiong/Desktop/gx.plist" isDirectory:&dir];
NSLog(@"flag1 = %i, dir = %i", flag1, dir);
//2.1是否可读
[fm1 isReadableFileAtPath:@"/Users/gaoxiong/Desktop/gx.plist"];
//2.2是否可写
[fm1 isWritableFileAtPath:@"/Users/gaoxiong/Desktop/gx.plist"];
//2.2是否可删
[fm1 isDeletableFileAtPath:@"/Users/gaoxiong/Desktop/gx.plist"];
//3.获取文件或者文件夹的属性
NSFileManager *manager = [NSFileManager defaultManager];
NSDictionary *info = [manager attributesOfItemAtPath:@"/Users/gaoxiong/Desktop/gx.plist" error:nil];
NSLog(@"info = %@", info);
//4.获取文件夹中的所有文件contentsOfDirectoryAtPath, 无法获取子文件
NSArray *res = [manager contentsOfDirectoryAtPath:@"/Users/gaoxiong/Desktop" error:nil];
NSLog(@"res = %@",res);
//4.1获取文件夹中的所有文件,包括子文件subpathsOfDirectoryAtPath
NSArray *rslt = [manager subpathsOfDirectoryAtPath:@"/Users/gaoxiong/Desktop" error:nil];
NSLog(@"rslt = %@", rslt);
//5.创建文件夹
//withIntermediateDirectories,如果指定路径中有文件夹不存在,是否自动创建文件夹
//attributes,指定创建出来的文件夹属性
//createDirectoryAtPath 只能创建文件夹
[manager createDirectoryAtPath:@"/Users/gaoxiong/Desktop/lu/lu" withIntermediateDirectories:YES attributes:nil error:nil];
//6.创建文件
//NSData : 二进制
//createFileAtPath 只能创建文件
NSString *str = @"lulu is pangding";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[manager createFileAtPath:@"/Users/gaoxiong/Desktop/lu.txt" contents:data attributes:nil];
//7.拷贝
[manager copyItemAtPath:@"/Users/gaoxiong/Desktop/gx.plist" toPath:@"/Users/gaoxiong/Desktop/gx/gx.plist" error:nil];
//8.移动/剪切
[manager moveItemAtPath:@"/Users/gaoxiong/Desktop/gx.plist" toPath:@"/Users/gaoxiong/Desktop/lu/gx.plist" error:nil];
//9.删除
[manager removeItemAtPath:@"/Users/gaoxiong/Desktop/lu.txt" error:nil];