Objective-C加强3Foundation框架
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;
删除
- (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是用来存储二进制字节数据的)
文件下载的简单思路
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操作)