1、 NSOperation 和 GCD 的选择
项目中使用 NSOperation 的优点是 NSOperation 是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化 NSOperation 的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用 GCD 的优点是 GCD 本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而 Block 参数的使用,会是代码更为易读,建议在简单项目中使用。
NSOperation 是对 GCD 面向对象的封装,但是 GCD 基于C语言开发,效率却更高. 建议如果任务之间有依赖关系或者想要监听任务完成状态的情况下优先选择 NSOperation 否则使用 GCD 。
NSOperration可以通过KVO监控操作进行的状态(准备、执行中、完成、被取消),GCD无;
NSOperration可以很容易管理各个操作之间的依赖关系(addDependency:),CGD可以通过Block的嵌套实现,较为复杂;
NSOperationQueue可以设置最大并发数量 (setMaxConcurrentOperationCount:),GCD无;
2、@Class 和 #import 区别
#import "B.h"
@interface A : NSObject {
B *b;
}
@end
这里,A类是引用类,B类是被引用类,这里先不考虑A类的实现文件。
- *#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息;
- 使用@class方式由于只需要只要被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#importl来包含被引用类的头文件;
- 通过上面2点也很容易知道在编译效率上,如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt(A->B, B->C,C->D…),一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了;
项目中使用model数据类需要使用 @class 声明
#import <UIKit/UIKit.h>
@class SDPModelForHotCity;
@interface SDPCellForHotCity : UITableViewCell
@property (nonatomic, retain)UIButton *buttonForMiss;
@property (nonatomic, retain)UILabel *labelForMiss;
- (void)passModelForHotCity:(SDPModelForHotCity *)model;
@end