1:类名
1.1:保证NSString在赋值时被复制
【推荐】NSString,在它被传递或者赋值时应当保证是一复制(copy)的方式进行的,这样可以防止在不知情的情况下NSString的值被其他对象修改。
- (void)setFoo:(NSString *)aFoo {
_foo = [aFoo copy];
}
或
@property (nonatomic, copy) NSString *aString;
1.2:方法名、参数名、成员变量、局部变量
【强制】参数名、局部变量都统一使用lowerCamelCase。尽量是英文语法表达,避免使用汉语拼音来命名,严禁使用拼音与英文混合的命名方式。
//正例:
endKeyboardRect / certNoView
//反例:
EndKeyboardRect / shenFenZhengView
1.3:方法名
【强制】应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格。在参数之前应该包含一个具有描述性的关键字来描述参数,方法名统一使用lowerCamelCase。
//正例:
- (void)keyboardWasShown:(NSNotification*)notification;
//反例:
-(void)keyboardWasShown:(NSNotification*)notification; //[方法类型之后未空格]
1.4:设计模式命名
【推荐】如果使用到了设计模式,建议在类名中体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。
//正例:
@interface AIFApiProxy : NSObject
@interface AIFServiceFactory : NSObject
2. 常量,字面量,枚举定义
2.1:常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。
//正例:
static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";
//反例:
#define CompanyName @"RayWenderlich.com"
2.2: NSString、NSDictionary、NSArray和NSNumber的字面值应该在创建这些类的不可变实例时被使用。请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。
//正例:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
//反例:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
2.3:当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。
//正例:
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
RWTLeftMenuTopItemMain,
RWTLeftMenuTopItemShows,
RWTLeftMenuTopItemSchedule
};
//反例:
enum GlobalConstants {
kMaxPinSize = 5,
kMaxPinCount = 500,
};
2.4:import 根框架(root frameworks),而非各单个文件
▪ 虽然有时我们仅需要框架(如Cocoa 或 Foundation)的某几个头文件,但引入根文件,编译器会运行的更快。因为根框架(root frameworks)一般会预编译,所以加载会更快。再次强
调:使用 #import 而非 #include 来引入Objective-C框架。如
#import <Foundation/Foundation.h> // 正例
#import <Foundation/NSArray.h> // 反例
#import <Foundation/NSString.h>
...
2.5:使用dispatch_once来执行只需运行一次的线程安全的代码
【强制】通过GCD提供的 dispatch_once函数可以简化代码,并保证线程安全。
+ (DataShareManager *)sharedInstance {
static DataShareManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[DataShareManager alloc] init];
});
return sharedManager;
}
2.6:Objective-C使用YES和NO
【推荐】因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。
//正例:
if (someObject) {}
if (![anotherObject boolValue]) {}
//反例:
if (someObject == nil) {}
if ([anotherObject boolValue] == NO) {}
if (isAwesome == YES) {} // Never do this.
if (isAwesome == true) {} // Never do this.
其他
3.1 不要使用new方法
【强制】尽管很多时候能用new代替alloc init方法,但这可能会导致调试内存时出现不可预料的问题。Cocoa的规范就是使用alloc init方法,使用new会让一些读者困惑。
3.2 #import 和 #include
【强制】
当引用的是一个Objective-C或者Objective-C++的头文件时,使用#import
当引用的是一个C或者C++的头文件时,使用#include,这时必须要保证被引用的文件提供了保护域(#define guard)
1:类名
1.1:保证NSString在赋值时被复制
【推荐】NSString,在它被传递或者赋值时应当保证是一复制(copy)的方式进行的,这样可以防止在不知情的情况下NSString的值被其他对象修改。
- (void)setFoo:(NSString *)aFoo {
_foo = [aFoo copy];
}
或
@property (nonatomic, copy) NSString *aString;
1.2:方法名、参数名、成员变量、局部变量
【强制】参数名、局部变量都统一使用lowerCamelCase。尽量是英文语法表达,避免使用汉语拼音来命名,严禁使用拼音与英文混合的命名方式。
//正例:
endKeyboardRect / certNoView
//反例:
EndKeyboardRect / shenFenZhengView
1.3:方法名
【强制】应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格。在参数之前应该包含一个具有描述性的关键字来描述参数,方法名统一使用lowerCamelCase。
//正例:
- (void)keyboardWasShown:(NSNotification*)notification;
//反例:
-(void)keyboardWasShown:(NSNotification*)notification; //[方法类型之后未空格]
1.4:设计模式命名
【推荐】如果使用到了设计模式,建议在类名中体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。
//正例:
@interface AIFApiProxy : NSObject
@interface AIFServiceFactory : NSObject
2. 常量,字面量,枚举定义
2.1:常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。
//正例:
static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";
//反例:
#define CompanyName @"RayWenderlich.com"
2.2: NSString、NSDictionary、NSArray和NSNumber的字面值应该在创建这些类的不可变实例时被使用。请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。
//正例:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
//反例:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
2.3:当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。
//正例:
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
RWTLeftMenuTopItemMain,
RWTLeftMenuTopItemShows,
RWTLeftMenuTopItemSchedule
};
//反例:
enum GlobalConstants {
kMaxPinSize = 5,
kMaxPinCount = 500,
};
2.4:import 根框架(root frameworks),而非各单个文件
▪ 虽然有时我们仅需要框架(如Cocoa 或 Foundation)的某几个头文件,但引入根文件,编译器会运行的更快。因为根框架(root frameworks)一般会预编译,所以加载会更快。再次强
调:使用 #import 而非 #include 来引入Objective-C框架。如
#import <Foundation/Foundation.h> // 正例
#import <Foundation/NSArray.h> // 反例
#import <Foundation/NSString.h>
...
2.5:使用dispatch_once来执行只需运行一次的线程安全的代码
【强制】通过GCD提供的 dispatch_once函数可以简化代码,并保证线程安全。
+ (DataShareManager *)sharedInstance {
static DataShareManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[DataShareManager alloc] init];
});
return sharedManager;
}
2.6:Objective-C使用YES和NO
【推荐】因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。
//正例:
if (someObject) {}
if (![anotherObject boolValue]) {}
//反例:
if (someObject == nil) {}
if ([anotherObject boolValue] == NO) {}
if (isAwesome == YES) {} // Never do this.
if (isAwesome == true) {} // Never do this.
其他
3.1 不要使用new方法
【强制】尽管很多时候能用new代替alloc init方法,但这可能会导致调试内存时出现不可预料的问题。Cocoa的规范就是使用alloc init方法,使用new会让一些读者困惑。
3.2 #import 和 #include
【强制】
当引用的是一个Objective-C或者Objective-C++的头文件时,使用#import
当引用的是一个C或者C++的头文件时,使用#include,这时必须要保证被引用的文件提供了保护域(#define guard)