Objective-C小技巧
《Effective Objective-C 2.0》读书笔记
1. 前向声明 @class
作用:告诉编译器某个类的存在
目的:在类的头文件中尽量少引用其他头文件,降低类之间的耦合。
用例:
// Person.h
#import <Foundation/Foundation.h>
@class Pet;
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) Pet *pet;
@end
如上在Person.h中并不需要用到Pet类中的细节,而只需要知道Pet的存在,则可以使用@class关键字,以将Pet.h的引用延后到它需要被用到的时候。
如下,如果不在Person.m文件中引入Pet.h的话,将无法访问Pet类中的任何方法和属性,当然也不能创建这个类。
// Person.m
// 报错:Receiver 'Pet' for class message is a forward declaration
// 类消息的接受者Pet是一个前向声明
- (instancetype)init
{
self = [super init];
if (self) {
_pet = [[Pet alloc]init];
}
return self;
}
不过只要不涉及这个类的内部细节就可以使用
- (void)getPet: (Pet *)pet{
_pet = pet;
}
使用位运算定义枚举类型
目的:在需要组合的枚举类型中用移位操作定义可以提高代码可读性
用例:
enum SeasonType {
SeasonSpring = 1 << 0, //春天 0001 '<<'左移运算
SeasonSummer = 1 << 1, //夏天 0010
SeasomAutumn = 1 << 2, //秋天 0100
SeasonWinter = 1 << 3, //冬天 1000
};
typedef enum SeasonType SeasonType;
/// beatifulSeason: 0111
SeasonType beatifulSeason = SeasonSpring | SeasonSummer | SeasomAutumn;
/// 随便写的,冬天当然也是美好的季节
if ( beatifulSeason & SeasonWinter ){
}
使用移位可以将每一个枚举选项的开启关闭状态定义在二进制数的每个位上,这样一来就可以使用位运算来组合多个状态了,也可以使用位运算来判断某些枚举值的开启和关闭状态。