什么是框架ios
众多功能\API的集合api
Foundation框架的做用数组
Foundation框架是Mac\iOS中其余框架的基础缓存
Foundation框架包含了不少开发中经常使用的数据类型:服务器
结构体网络
枚举app
类框架
如何使用Foundation框架函数
要想使用Foundation框架中的功能,包含它的主文件便可atom
#import <Foundation/Foundation.h>
Foundation框架中的类
Foundation框架提供了很是多好用的类, 好比
NSString : 字符串
NSArray : 数组
NSDictionary : 字典
NSDate : 日期
NSData : 数据
NSNumber : 数字
Foundation框架中的类都是以NS为前缀(Next Step的缩写)
乔布斯于1976年创立苹果公司
乔布斯于1985年离开苹果公司, 创立NeXT公司, 开发了Next Step操做系统
在开发Next Step操做系统过程当中产生了Foundation框架
1997年, 苹果公司收购NeXT公司, 乔布斯重返苹果公司(Mac系统就是基于Next Step系统)
2007年, 苹果公司发布了iOS系统(iOS系统基于Mac系统)
不当心修改了系统文件
有时候会在不经意之间修改了系统自带的头文件, 好比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的建立
NSString的建立方式比较多
最直接的方式(这是常量字符串)
NSString *str = @"I'm in itcast.";
格式化的方式
NSString *str = [NSString stringWithFormat:@"My age is %d", 10];
NSString *str = [[NSString alloc] initWithFormat:@"My age is %d", 10];
从文件中读取
从URL中读取
从文件中读取
// 用来保存错误信息
NSError *error = nil;
// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/mj/Desktop/test.txt" encoding:NSUTF8StringEncoding error:&error];
// 若是有错误信息
if (error) {
NSLog(@"读取失败, 错误缘由是:%@", [error localizedDescription]);
} else { // 若是没有错误信息
NSLog(@"读取成功, 文件内容是:\n%@", str);
}
从URL中读取
// 用来保存错误信息
NSError *error = nil;
// 建立URL路径
NSURL *url = [NSURL URLWithString:@"file:///Users/mj/Desktop/test.txt"];
// 读取文件内容
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
// 若是有错误信息
if (error) {
NSLog(@"读取失败, 错误缘由是:%@", [error localizedDescription]);
} else { // 若是没有错误信息
NSLog(@"读取成功, 文件内容是:\n%@", str);
}
URL
什么是URL
URL的全称是Uniform Resource Locator(统一资源定位符)
URL是互联网上标准资源的地址
互联网上的每一个资源都有一个惟一的URL,它包含的信息指出资源的位置
根据一个URL就能找到惟一的一个资源
URL的格式
基本URL包含协议、主机域名(服务器名称\IP地址)、路径
举例: http://ios.itcast.cn/ios/images/content_25.jpg
能够简单认为: URL == 协议头://主机域名/路径
常见的URL协议头(URL类型)
http\https :超文本传输协议资源, 网络资源
ftp :文件传输协议
file :本地电脑的文件
URL的建立
传入完整的字符串建立
NSURL *url = [NSURL URLWithString:@"file:///Users/mj/Desktop/str.txt"];
经过文件路径建立(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/mj/Desktop/str.txt"];
NSString的存储
能够将NSString存储到一个文件中
NSString *str = @"哇哈哈哈";
[str writeToFile:@"/Users/mj/Desktop/str.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
[str writeToURL:[NSURL URLWithString:@"/Users/mj/Desktop/str.txt"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSString的大小写处理
- (NSString *)uppercaseString;
所有字符转为大写字母
- (NSString *)lowercaseString
所有字符转为小写字母
- (NSString *)capitalizedString
首字母变大写,其余字母都变小写
NSString的比较
- (BOOL)isEqualToString:(NSString *)aString;
两个字符串的内容相同就返回YES, 不然返回NO
- (NSComparisonResult)compare:(NSString *)string;
这个方法能够用来比较两个字符串内容的大小
比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult做为比较结果
NSComparisonResult是一个枚举,有3个值:
若是左侧 > 右侧,返回NSOrderedDescending,
若是左侧 < 右侧,返回NSOrderedAscending,
若是左侧 == 右侧返回NSOrderedSame
- (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
忽略大小写进行比较,返回值与compare:一致
NSString的搜索
- (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 iOS”中的@“iOS”能够用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的截取和替换
- (NSString *)substringFromIndex:(NSUInteger)from;
从指定位置from开始(包括指定位置的字符)到尾部
- (NSString *)substringToIndex:(NSUInteger)to;
从字符串的开头一直截取到指定的位置to,但不包括该位置的字符
- (NSString *)substringWithRange:(NSRange)range;
按照所给出的NSRange从字符串中截取子串
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
用replacement替换target
NSString与路径
- (BOOL)isAbsolutePath;
是否为绝对路径
- (NSString *)lastPathComponent;
得到最后一个目录
- (NSString *)stringByDeletingLastPathComponent;
删除最后一个目录
- (NSString *)stringByAppendingPathComponent:(NSString *)str;
在路径的后面拼接一个目录
(也可使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
NSString与文件拓展名
- (NSString *)pathExtension;
得到拓展名
- (NSString *)stringByDeletingPathExtension;
删除尾部的拓展名
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
在尾部添加一个拓展名
NSString的其余用法
- (NSUInteger)length;
返回字符串的长度(有多少个文字)
- (unichar)characterAtIndex:(NSUInteger)index;
返回index位置对应的字符
转为基本数据类型
- (double)doubleValue;
- (float)floatValue;
- (int)intValue;
- (char *)UTF8String;
转为C语言中的字符串
NSString去除空格
去除全部的空格
[str stringByReplacingOccurrencesOfString:@" " withString:@""]
去除首尾的空格
[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableString
NSMutableString是NSString的子类
NSMutableString和NSString的区别
NSString是不可变的, 里面的文字内容是不能进行修改的
NSMutableString是可变的, 里面的文字内容能够随时更改
NSMutableString能使用NSString的全部方法
NSMutableString的经常使用方法
- (void)appendString:(NSString *)aString;
拼接aString到最后面
- (void)appendFormat:(NSString *)format, ...;
拼接一段格式化字符串到最后面
- (void)deleteCharactersInRange:(NSRange)range;
删除range范围内的字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
在loc这个位置中插入aString
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
使用aString替换range范围内的字符串
NSArray
什么是NSArray
NSArray是OC中的数组类, 开发中建议尽可能使用NSArray替代C语言中的数组
C语言中数组的弊端
int array[4] = {10, 89, 27, 76};
只能存放一种类型的数据
不能很方便地动态添加数组元素
不能很方便地动态删除数组元素
NSArray的使用注意
只能存听任意OC对象, 而且是有顺序的
不能存储非OC对象, 好比int\float\double\char\enum\struct等
它是不可变的, 一旦初始化完毕后, 它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
NSArray的建立
NSArray常见的建立方式有
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(id)firstObj, ...;
+ (instancetype)arrayWithArray:(NSArray *)array;
+ (id)arrayWithContentsOfFile:(NSString *)path;
+ (id)arrayWithContentsOfURL:(NSURL *)url;
能够将一个NSArray保存到文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
NSArray的检索
- (NSUInteger)count;
获取集合元素个数
- (id)objectAtIndex:(NSUInteger)index;
得到index位置的元素
- (BOOL)containsObject:(id)anObject;
是否包含某一个元素
- (id)lastObject;
返回最后一个元素
- (id)firstObject;
返回最后一个元素
NSArray的检索
- (NSUInteger)indexOfObject:(id)anObject;
查找anObject元素在数组中的位置(若是找不到,返回-1)
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
在range范围内查找anObject元素在数组中的位置
NSArray的简写
自从2012年开始, Xcode的编译器多了不少自动生成代码的功能, 使得OC代码更加精简
数组的建立
以前
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
如今
@[@"Jack", @"Rose", @"Jim"];
数组元素的访问
以前
[array objectAtIndex:0];
如今
array[0];
NSArray给全部元素发消息
- (void)makeObjectsPerformSelector:(SEL)aSelector;
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
让集合里面的全部元素都执行aSelector这个方法
NSArray遍历元素
遍历, 就是将NSArray里面的全部元素一个一个取出来查看
常见的遍历方式有
普通遍历
for (int i = 0; i<array.count; i++) { }
快速遍历
for (id obj in array) { }
Block遍历
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
}];
NSArray与NSString
- (NSString *)componentsJoinedByString:(NSString *)separator;
这是NSArray的方法, 用separator做拼接符将数组元素拼接成一个字符串
- (NSArray *)componentsSeparatedByString:(NSString *)separator;
这是NSString的方法, 将字符串用separator做为分隔符切割成数组元素
NSMutableArray
什么是NSMutableArray
NSMutableArray是NSArray的子类
NSArray是不可变的, 一旦初始化完毕后, 它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
NSMutableArray是可变的, 随时能够往里面添加\更改\删除元素
NSMutableArray添加元素
- (void)addObject:(id)object;
添加一个元素
- (void)addObjectsFromArray:(NSArray *)array;
添加otherArray的所有元素到当前数组中
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
在index位置插入一个元素
NSMutableArray删除元素
- (void)removeLastObject;
删除最后一个元素
- (void)removeAllObjects;
删除全部的元素
- (void)removeObjectAtIndex:(NSUInteger)index;
删除index位置的元素
- (void)removeObject:(id)object;
删除特定的元素
- (void)removeObjectsInRange:(NSRange)range;
删除range范围内的全部元素
NSMutableArray替换元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
用anObject替换index位置对应的元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
交换idx1和idx2位置的元素
NSMutableArray的简写
设置元素
之前
[array replaceObjectAtIndex:0 withObject:@"Jack"];
如今
array[0] = @"Jack";
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的常见使用
- (NSUInteger)count;
返回字典的键值对数目
- (id)objectForKey:(id)aKey;
根据key取出value
将字典写入文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
NSDictionary的遍历
快速遍历
for (NSString *key in dict) { }
Block遍历
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
}];
NSDictionary的简写
NSDictionary的建立
之前
[NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"name", @"男", @"sex", nil];
如今
@{@"name": @"Jack", @"sex" : @"男”};
NSDictionary获取元素
之前
[dict objectForKey:@"name”];
如今
dict[@"name”];
NSMutableDictionary
什么是NSMutableDictionary
NSMutableDictionary是NSDictionary的子类
NSDictionary是不可变的, 一旦初始化完毕后, 它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
NSMutableDictionary是可变的, 随时能够往里面添加\更改\删除元素
NSMutableDictionary的常见操做
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
添加一个键值对(会把aKey以前对应的值给替换掉)
- (void)removeObjectForKey:(id)aKey;
经过aKey删除对应的value
- (void)removeAllObjects;
删除全部的键值对
NSMutableDictionary的简写
设置键值对
之前
[dict setObject:@"Jack" forKey:@"name”];
如今
dict[@"name"] = @"Jack";
NSFileManager
什么是NSFileManager
顾名思义, NSFileManager是用来管理文件系统的
它能够用来进行常见的文件\文件夹操做
NSFileManager使用了单例模式
使用defaultManager方法能够得到那个单例对象
[NSFileManager defaultManager]
NSFileManager的常见判断
- (BOOL)fileExistsAtPath:(NSString *)path;
path这个文件\文件夹是否存在
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
path这个文件\文件夹是否存在, isDirectory表明是否为文件夹
- (BOOL)isReadableFileAtPath:(NSString *)path;
path这个文件\文件夹是否可读
- (BOOL)isWritableFileAtPath:(NSString *)path;
path这个文件\文件夹是否可写
- (BOOL)isDeletableFileAtPath:(NSString *)path;
path这个文件\文件夹是否可删除
NSFileManager的文件访问
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
得到path这个文件\文件夹的属性
- (NSArray *)subpathsAtPath:(NSString *)path;
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
得到path的全部子路径
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
得到path的当前子路径
- (NSData *)contentsAtPath:(NSString *)path;
得到文件内容
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;
删除
NSFileManager的文件操做
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
建立文件夹(createIntermediates为YES表明自动建立中间的文件夹)
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
建立文件
(NSData是用来存储二进制字节数据的)
文件下载的简单思路
2.服务器发出响应,返回文件数据
3.手机客户端利用NSData来存放
服务器返回的文件数据
4.利用NSFileManager将NSData
里面的文件数据写到新的文件中
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
NSSize\CGSize
CGSize和NSSize是同义的
typedef CGSize NSSize;
CGSize的定义
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
CGSize表明的是二维平面中的某个物体的尺寸(宽度和高度)
可使用CGSizeMake和NSMakeSize函数建立CGSize
NSRect\CGRect
CGRect和NSRect是同义的
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的建立
之前
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
如今
@10;
@10.5;
@YES;
@(num);
NSNumber的经常使用方法
从NSNumber中取出以前包装的基本数据类型
- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
- (NSComparisonResult)compare:(NSNumber *)otherNumber;
- (BOOL)isEqualToNumber:(NSNumber *)number;
NSValue
NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
NSValue能够包装任意值
所以, 能够用NSValue将结构体包装后, 加入NSArray\NSDictionary中
常见结构体的包装
为了方便 结构体 和 NSValue 的转换, Foundation提供了如下方法
将结构体包装成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日期格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 将NSString转换为NSDate
NSDate *date = [formatter dateFromString:@"2010-03-24 00:00:00"];
// 将NSDate转换为NSString
NSLog(@"%@", [formatter stringFromDate:date]);
NSCalendar
结合NSCalendar和NSDate能作更多的日期\时间处理
得到NSCalendar对象
NSCalendar *calendar = [NSCalendar currentCalendar];
得到年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
比较两个日期的差距
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
NSObject
NSObject能够是全部类的基类, 内部定义了不少经常使用的方法
- (BOOL)isKindOfClass:(Class)aClass;
判断是否为aClass或者aClass的子类的实例
- (BOOL)isMemberOfClass:(Class)aClass
判断是否为aClass的实例(不包括aClass的子类)
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
判断对象是否实现了aProtocol协议
- (BOOL)respondsToSelector:(SEL)aSelector
判断对象是否拥有参数提供的方法
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
延迟调用参数提供的方法,方法所需参数用withObject传入
NSString的其余使用场合
经过类名的字符串形式实例化对象
Class class = NSClassFromString(@"Student");
Student *stu = [[class alloc] init];
将类名变成字符串
Class class = [Student class];
NSString *className = NSStringFromClass(class);
经过方法的字符串形式实例化方法
SEL selector = NSSelectorFromString(@"setName:");
[stu performSelector:selector withObject:@"Mike"];
将方法变成字符串
NSStringFromSelector(@selector(setName:));
集合的内存管理
集合,就是能用来容纳OC对象的容器
NSArray、NSDictionary等都是
集合有一些内存管理细节
只要将一个对象添加到集合中,这个对象计数器就会 + 1(作一次retain操做)
只要将一个对象从集合中移除,这个对象计数器就会 - 1(作一次release操做)
若是集合被销毁了,集合里面的全部对象计数器都会 - 1(作一次release操做)