《Effective Objective-C》笔记

1 了解 Objective-C 的起源

该语言使用“消息结构”(messaging structure)而非“函数调用”(function calling)。

2 在类的头文件中尽量少引入其他头文件

注意使用 @class 关键字。

3 多用字面量语法

使用字面量语法创建数组、字典,具有更高的可读性,代码也更简洁。

数值

NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;

数组

NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];

字典

NSDictionary *personData = 
    @{@"firstName" : @"Matt",
      @"lastName"  : @"Galloway",
      @"age"       : @28}; 

4 多用类型常量,少用 #define 预处理指令

宏定义

#DEFINE ANIMATION_DURATION 0.3

类型常量

static const NSTimeInterval kAnimationDuration = 0.3

类型常量的命名规则:若常量只在某个类内部使用,加前缀 k;若在类之外可邮,则通常以类名为前缀。

注意常量定义的正确位置;如果需要在类内部使用:

// EOCAnimateView.m
#import "EOCAnimatedView.h"

static const NSTimeInterval kAnimationDuration = 0.3;

@implementation EOCAnimatedView
// ...

@end

如果需要暴露给外部,需要在头文件中声明,在实现文件中定义(赋值)。

// 这是某个头文件
extern NSString *const EOCStringConstant
// 刚才那个头文件对应的m文件
NSString *const EOCStringConstant = @"value";

5 用枚举表示状态、选项、状态码

学会使用 NS_ENUMNS_OPTIONS 两个宏

typedef NS_ENUM(NSUInteger, EOCConnectionState) {
   EOCConnectionStateDisconnected,
   EOCConnectionStateConnecting,
   EOCConnectionStateConnected,
};

typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) {
   EOCPermittedDirectionUp    = 1 << 0,
   EOCPermittedDirectionDown  = 1 << 1,
   EOCPermittedDirectionLeft  = 1 << 2,
   EOCPermittedDirectionRight = 1 << 3,
};

在使用 Switch 语句处理表达状态的 enum 时,最好不要加 default。如果稍后在 enum 中增加了新的状态,编译器会发出警告。