在类的头文件中尽量少引入其他头文件
- 除非真的有必要,否则不要引入头文件(#import)。一般来说,应在某个类的头文件(.h)中使用前向声明(@class)来提及别的类,并在实现文件(.m)中引入那些类的头文件。这样做可以尽量降低类之间的耦合。
- 有时无法使用前向声明,比如要声明某个类遵循一项协议,这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。再比如,写的类继承自某个超类,则必须引入定义那个超类的头文件。
多用字面量语法,少用与之等价的方法
- 应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
NSString *string = @"test";
NSArray *array = @[@(1), @(2), @(3)];
NSDictionary *dictionary = @{@"string": string, @"array": array};
- 应该通过取下标操作来访问数组下标或字典中的键对应的元素。
NSNumber *number = array[2]; (2)
NSString *str = dictionary[@"string"]; (test)
- 如果数组与字典对象是可变的(mutable),也可以通过下标修改其中的元素值。
//标准做法
[mutableArray replaceObjectAtIndex:1 withObject:@"dog"];
[mutableDictionary setObject:@"McGrady" forKey:@"lastName"];
//取下标
mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"McGrady";
- 用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。
- 字面量语法的限制,就是除了字符串以外,所创建的对象必须属于Foundation框架才行。并且使用字面量语法创建出来的都是不可变的(immutable),若想要可变版本的对象,则需要复制一份:
NSMutableArray *mutable = [@[@(1), @(2), @(3)] mutableCopy];
多用类型常量,少用#define预处理指令
- 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。
#define num @(1)
NSString *numString = num;
- 在实现文件中使用static const来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。由于此类常量不在全局符号表中,所以无须为其名称前加前缀。
// EOCAnimatedView.h
#import <UIKit/UIKit.h>
@interface EOCAnimatedView : UIView
- (void)animate;
@end
// EOCAnimatedView.m
#import "EOCAnimatedView.h"
static const NSTimeInterval kAnimationDuration = 0.3;
@implementation EOCAnimatedView
- (void)animte{
[UIViewAnimateWithDuration:kAnimation animations:^(){
//perform animations
}];
}
@end
- 在头文件中使用static const来声明全局常量,并在实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区隔,通常用与之相关的类名做前缀。
// EOCAnimatedView.h
extern const NSTimeInterval EocAnimatedViewAnimationDuration;
// EOCAnimtatedView.m
const NSTimeInterval EOCAnimatedViewAnimationDuration = 0.3;