第七章 系统框架
第四十七条:熟悉系统框架
iOS应用程序中不允许使用 自定义的动态库,一般都是静态库,系统框架是动态库。
- 系统框架
Foundation 提供基础核心功能
CoreFoundation C语言API
CFNetwork 提供C语言级别的网络通信能力,他将“BSD socket”抽象成易于使用的网络接口。
AVFoundation 回访录制音视频
coreAudio 提供C语言API可用来操作设备上的音视频硬件
coreData 可将对象放入数据库 便于永久保存。
coreText 可以高效执行文字排版以及渲染操作。
UIKit APPKit UI框架
CoreAnimation 渲染图形并播放动画
CoreGraphics 框架 C语言框架,提供2D渲染所必备蹲的数据结构与函数。
第四十八条:多用块枚举,少用for循环
-
for循环
-
NSEnumerator遍历
优势在于不论遍历那种类型 都采用相近的语法,有多种“枚举器”(如:objectEnumerator,reverseObjectEnumerator,keyEnumerator)
NSEnumerator * enum = [array objectEnumerator];
id object;
while((object = [enum nextObject] != nil)){
}
-
快速遍历 for in
-
基于块的遍历方式
// 好处:
//(1) 遍历时 既能知道对象 也能知道下标 stop终止遍历
// (2)能够修改 块的方法类型
- (void)enumerateObjectsUsingBlock:(void(^)(id object,NSUInteger idx,BOOL * stop))block;
第四十九条:对自定义 其内存管理语义的collection使用无缝桥接
使用“无缝桥接”技术,可以在定义于Foundation框架中的Objective-C类和定义于CoreFoundation框架中的C数据结构之间相互转换。
“桥式转换”:
- __bridge 告诉ARC如何处理转换所涉及的Objective-C对象;ARC仍然具备这个Objective-C对象的所有权。
- __bridge_retained ARC将交出对象的所有权。
- __bridge_transfer 反向转换
第五十条:构建缓存时 选用NSCache而非NSDictionary
-
NSCache 用来缓存资源,当系统资源将要耗尽时,它可以自动删减缓存,优先删减“最久未使用的缓存”。
-
NSCache 不会“拷贝”键,而是“保留”键。
-
NSCache 是线程安全的。多个线程可以同时访问NSCache。
-
NSCache 可以控制缓存删减内容的时机:可调整
(1)缓存中对象总数;
(2)所有对象的“总开销”;
-
NSPurgeableData类
当系统资源紧张时,可以把保存NSpureableData对象的那块内存释放掉。
// beginContentAccess :告诉他 现在不应该丢弃自己所占用的内存。
// endContentAccess :告诉他用完了,在必要时可以丢弃自己所占据的内存。
第五十一条:精简initialize 与 load的实现代码
-
+(void)load;
load方法的问题在于:执行该方法时,运行期系统处于“脆弱状态”。无法确定个各类的载入顺序,因此,在load方法中使用其他类是不安全的。
image.png
无法确定EOCClassA 是不是已经加载好了!!!EOCClassA可能在load中执行某些重要操作。
load不遵循继承规则,整个应用程序在执行load方法时都会阻塞。
- +(void)initialize
该方法会在程序首次用该类之前调用,且只调用一次。由运行期系统来调用。“惰性调用”,initialize方法只应该用来设置内部数据。
** 线程安全 **
只有执行initialize的那个线程,可以操作类或者类的实例。其他线程都要阻塞等待initialize执行完。
遵循继承规则
简化的原因:
(1)初始化期间会一直阻塞
(2)无法控制累的初始化时机
(3)如果某个类的实现代码很复杂,那么其中可能会直接或者间接用到其他类。
第五十二条 别忘了NSTimer会保留其目标对象
只有把计数器放到运行循环里,它才能正常触发任务。
// 此方法创建出来的计时器,会在指定时间间隔之后执行任务
+ (NSTimer *)schedledtimerWithTimeInterval:(NSTimeInterval)secondes target:(id)target selector:(SEL)selector userInfo:(id)userInfo repeats:(BOOL)repeats;
由于计时器会保留其目标对象,所以反复执行任务 ,很容易引入“保留环”,通常会导致应用程序出问题。
- NSTimer对象会保留其目标,直到计时器本身失效为止,调用invalidate方法可以令计时器失效。另外一次性的计时器在触发完任务后也会失效。
- 反复执行任务的计时器,很容易引入保留环,如果这种计时器的目标对象有保留了计时器本身,那肯定会导致保留环。
-
可以扩充NSTimer的功能,用“块”来打破保留环,不过,除非NSTimer将来在公共接口里提供此功能,否则必须创建分类,实现代码。
网友评论