OC系列之Foundation框架
2015-10-04 17:25
531 查看
一 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[/code]
- (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这个位置中插入aStringNSMutableString *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;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作拼接符将数组元素拼接成一个字符串NSArray *arr = @[@"ldj", @"lq", @"jjj", @"xwq"]; NSString *res = [arr componentsJoinedByString:@"*"]; NSLog(@"res = %@", res); 输出结果: ldj*lq*jjj*xwq
字符串分割方法
- (NSArray )componentsSeparatedByString:(NSString )separator;
这是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和CGPointtypedef CGPoint NSPoint; CGPoint的定义 struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; typedef double CGFloat;
CGPoint代表的是二维平面中的一个点
可以使用CGPointMake和NSMakePoint函数创建CGPoint
2.NSSize和CGSizetypedef CGSize NSSize; CGSize的定义 struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize;
CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
可以使用CGSizeMake和NSMakeSize函数创建CGSize
3.NSRect和CGRecttypedef 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 )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 -> NSDateNSString *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这个文件\文件夹是否可删除
系统目录不允许删除
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);
- (NSData )contentsAtPath:(NSString )path;
获得文件内容
- (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);
相关文章推荐
- CUDA学习:第一CUDA代码:数组求和
- webservice设置--“/WebServiceForTest”应用程序中的服务器错误。
- 11 java.util.ArrayList
- Android开发学习系列(一)——Android按钮圆角美化
- 使用maven开发MR
- 单例模式
- WKID对应坐标系
- pat1023Have Fun with Numbers (20)
- 计算机硬件组成以及核心硬件
- php mysqli_connect_error()与mysqli_connect_errno()函数的区别
- 用Python学习统计学基础-6
- MySQL 最经常使用的一千行
- tcpdump分析网络故障的例子
- GOF 23 设计模式 之 模版方法模式(template method)
- 机器学习算法-K最近邻从原理到实现(Python)
- Codeforces Round #323 (Div. 2) (583A,583B,582A,582B)
- EF异常:对一个或多个实体的验证失败
- 摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释
- 摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释
- C++ map容器 按照value值排序