您的位置:首页 > 其它

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这个位置中插入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;

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和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 )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这个文件\文件夹是否可删除

系统目录不允许删除

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: