CocoaTouch: Cocoa本身并不是框架,但是里面集成了一批创建应用程序时经常用到的框架,开发者会碰到的主要框架就是Foundation
Foundation:内部的类都使用NS作为前缀,此前缀是在Objective-C语言作为NeXTSTEP系统的编程语言时首都确定的
CoreFoundation:Foundation框架中的的许多功能都能在CoreFoundation中找到对应的C语言API,也叫无缝桥接(可以把CoreFoundation中的C语言数据平滑转化为Foundation中的OC对象,反之亦然)
CFNetWork:提供了C语言级别的网络通信能力,将“BSD套接字”(BSD socket)抽象成易于使用的网络接口。而Foundation则将框架部分内容封装成OC接口(NSURLConnection从URL中下载数据)
CoreAudio: 提供C语言API用来操作设备上的音频硬件,可以抽象出另一套OC的API
AVFoundation: 提供OC的API来回放并录制音频和视频
CoreData:提供OC接口,将对象放入数据库
CoreText:此框架提供的C语言接口可以高效执行文字排版及渲染操作
-
技巧三十三:多用块枚举,少用for循环
C语言for遍历字典和NSSet
NSDictionary *dict;
NSArray *keyArr = [dict allKeys];
for (int i = 0; i < keyArr.count; i++) {
id key = keyArr[i];
id value = dict[key];
NSLog(@"%@",value);
}
NSSet *set;
NSArray *objectArr = [set allObjects];
for (int i = 0; i < objectArr.count; i++) {
NSLog(@"%@",objectArr[i]);
}
For循环的优势: 反向遍历
Objective-C 1.0 :NSEnumerator遍历,读写更为顺畅
//NSArray
NSArray *arr;
//反向遍历数组枚举器 [arr reverseObjectEnumerator];
NSEnumerator *enumerator = [arr objectEnumerator];
id object;
while ((object = [enumerator nextObject]) != nil) {
//do Something With object
}
//NSDictionary
NSDictionary *dict;
NSEnumerator *keyEnumerator = [dict keyEnumerator];
id key;
while ((key = [keyEnumerator nextObject]) != nil) {
id value = dict[key];
}
//NSSet
NSSet *set;
NSEnumerator *setEnumerator = [set objectEnumerator];
id object;
while ((object = [setEnumerator nextObject]) != nil) {
//do Something With object
}
object-c 2.0 引入了快速遍历这一功能 for in
最新的遍历模式:“块枚举法”
dict enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions) usingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
//可根据 NSEnumerationOptions 枚举,使用并发事宜
}
-
技巧三十四:构建缓存的时候用 NSCache 而非 NSDictionary
使用场景:下载网络图片
NSCache的优势:
- 低内存警告自动删减缓存(优先删除最久未使用的对象)
- 键可以由不支持拷贝的对象来担任
- 线程安全
- 可控缓存删减的时机 (总开销值、对象总数)
//NSPurgeableData 为 NSMutableData 的子类
NSPurgeableData *pData = [NSPurgeableData new];
//类似引用计数, 创建对象的时候会 + 1 ,获取的时候才需要beginContentAccess
// [pData beginContentAccess];
[pData endContentAccess];
-
技巧三十五:计时器的使用和释放
计时器会保留其目标对象,直到自身失效后才释放。一次性计时器,执行完相关任务后就会自动失效,重复性计时器必须手动释放invalidate
网友评论