EffectiveOC的学习-8

这里是EffectiveOC的 47 - 52条 , 系统框架

2016-09-05 | 阅读

47. 熟悉系统框架

iOS开发使用Cocoa Touch框架,而Cocoa并不是框架,而是一批框架的集合。在其中,最重要的是 Foundation.

Foundation框架中的类,拥有前缀NS,这个前缀是在NeXTSTEP操作系统开发时确定的。 Foundation提供了类,字符串,collection等基础的核心功能。与Foundation相应,有一个CoreFoundation框架,两个框架为一些相似的功能提供了接口,但是前者是Objective-C的API,而后者是C语言的API. 可以使用toll-free bridgingCoreFoundation中的C语言数据结构转换为Foundation中的OC对象。

UIKit提供了构建于Foundation上的UI组件。而在UIKit之下,是CoreAnimationCoreGraphics .

CoreGraphics是使用C语言编写,提供了2D渲染必需的数据结构和函数,即这个库是iOS中视图绘制的基础。

CoreAnimation,也就是QuartzCore,使用Objective-C编写,提供一些工具,用来渲染图形并播放动画。

基础的系统框架要学习和使用,熟知一些常用的框架。以上4个,我觉得熟悉其主要功能和使用方式后,iOS的基本开发已经游刃有余了。

48. 遍历集合时,多用block枚举,少用for 循环

对于集合的遍历,我们常用两种方式 ,for-in :

NSArray *array = ... ;
for (NSString *str in array){
	// ....
}

基于block的枚举 ,如 NSArray

- (void)enumerateObjectsUsingBlock:(void(^)(id object , NSUInteger idx,BOOL *stop))block;

50. 构建缓存使用NSCache而非NSDictionary

NSCache的优点:

  • 会根据系统资源的情况,进行自动的删除缓存操作,且其是基于LRU策略,即优先删除最久未使用的对象。
  • 是线程安全的, NSMutableDictionary不是线程安全的。
  • 可以设置存储的容量
  • 可以对存储内容设置权值,增加一些内容的权值,以尽量保存这些比较重要的内容。

51. 精简initialize和load的实现方法

load方法:对于加入运行期的每个类和category,都会调用此方法,且只会在初始化一次。而且load方法是可以在不同的category中存在多份的。先调用所有父类和祖先类中的load方法,然后是类中的load方法,再调用category中的load.

load方法是在程序启动时,加载类的阶段执行的,所以其中代码尽量精简,不要做耗时操作。

initialize方法,会在程序首次调用类时调用,也只会调用一次。但其与load最大的不同,在于子类会继承父类的initialize方法:

@interface A : NSObject
@end
@implementation A
+ (void)initialize {
	NSLog(@"%@ initialize",self);
}
@end

@interface B : A
@end

@implementation B
@end

这段代码,在第一次调用 B 类时,会输出 :

A initialize
B initialize

52. NSTimer会保留目标对象而造成保留环

这个问题就比较简单了。建议使用一个自行编写的block形式的timer来处理保留环问题。

总结

Effective Objective-C , 对于一些基础的知识,介绍还是相当不错的。但是时间比较久远,一些细节的内容,已经比较落后,且意义不大。如本章的一些问题,就过于简单,没太大必要单独提出进行讨论。