目录
1.格式和换行 2.命名 3.oc下的cocoa编码规范 4.注释要求 5.其他 6.参考文档 附:ARC下编码注意事项
序
此文档根据apple、google以及其他一些业界知名的oc编码规范整理而成,并作了大量精简,旨在为大家的iOS开发规范提供一份简单、清晰、统一的参考指南。
1.格式和换行
1.1 只使用2个空格来缩进,不使用tab. 1.2 方法长度不超过100行,建议不超过80行。 1.3 方法- 和 + 和返回值之前为1个空格;方法参数之间有一个空格,其他地方不出现多余的空格。 1.4 条件语句的格式,推荐如下:
if (user.isHappy) { //Do something} else { //Do something else}或:(苹果官方代码缩进方式)if (user.isHappy) { //Do something} else { //Do something else}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
不推荐如下的缩进:
if (user.isHappy){ //Do something}else { //Do something else}
1
2
3
4
5
6
7
1
2
3
4
5
6
7
2.命名
2.1 命名统一使用驼峰命名法;只采纳有广为人知含义的缩写,比如info、msg、UI、HTTP这类。自造的缩写不被认可。总体的命名原则是清晰和一致,避免歧义。 2.2 命名类、协议、常量和typedef结构体时考虑使用前缀,主要目的是为了避免冲突。方法名存在特定类的命名空间内,无需使用前缀。 2.3 方法首字母小写(方法以大写缩略词开始除外);文件夹名和类名首字母大写。不使用下划线作为私有方法的前缀,此方式被苹果保留。 2.4 全局常量尽量不要使用宏定义。宏很可能被重定义,而且引用不同的文件可能会导致宏的不同,所以尽量使用const来定义常量。 2.5 避免使用newXXX、getXXX、setXXX来命名变量和方法。
3.oc下的cocoa编码规范
3.1 使用#pragma mark来分类方法,参考以下结构:
pragma mark - Lifecycle- (instancetype)init {}- (void)dealloc {}- (void)viewDidLoad {}- (void)viewWillAppear:(BOOL)animated {}- (void)didReceiveMemoryWarning {}#pragma mark - Custom Accessors- (void)setCustomProperty:(id)value {}- (id)customProperty {}#pragma mark - IBActions- (IBAction)submitData:(id)sender {}#pragma mark - Public- (void)publicMethod {}#pragma mark - Private- (void)privateMethod {}#pragma mark - Protocol conformance#pragma mark - UITextFieldDelegate#pragma mark - UITableViewDataSource#pragma mark - UITableViewDelegate#pragma mark - NSCopying- (id)copyWithZone:(NSZone *)zone {}#pragma mark - NSObject- (NSString *)description {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
3.2 重载系统方法时,不要忘记先调用super的方法;比如init、viewdidload等。 3.3 属性必须指定其类型:比如(nonatomic,strong)。 3.4 使用#import引入oc/oc++头文件,使用#include引入c/c++头文件。 3.5 尽量精简你的公开api接口。无需公开的方法应为私有。 3.6 init和dealloc方法中避免使用self.来访问成员变量。 3.7 dealloc方法中对变量的释放应和初始化时的顺序相反。 3.8 对nsstring使用copy。 3.9 不要手动抛出objective-c的异常(但你可以尝试捕获异常以增加应用的健壮性)。 3.10 不同类型的强制转换需要注意是否造成数据丢失、溢出等问题。 3.11 推荐使用@property来自动合成属性,如非必要无需再写@synthesize相关代码。
4.注释要求
注释一般用来解释代码的意图。要保持注释和代码同步更新,表达准确,避免误导。尽可能写自注释的代码。尽量使用单行注释而不是块注释;需要文档化的代码可以使用vvdocumenter-xcode插件来帮助生成。
5.其他
5.1 delegate对象不应该被retain,这样做会造成retain环。 5.2 使用__weak来消除block中的retain环,例如:
__weak __typeof(self)weakSelf = self;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ __strong __typeof(weakSelf)strongSelf = weakSelf; // use strongSelf here to invoke methods. [strongSelf testSelfMethod]; };
1
2
3
4
5
6
1
2
3
4
5
6
5.3 苹果官方主要推荐的是MVC的架构,其他各种流行架构也是在MVC基础上的变种。写代码时需要注意model/view/controller之间的分离,保持清晰的层次关系。
6.参考文档
苹果cocoa编码指南 google objc编码指南 objc编码指南:by raywenderlich.com
7.附:ARC下编码注意事项
7.1.代码中不能使用retain, release, retain, autorelease 7.2.不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc]) 7.3.不能使用NSAllocateObject, NSDeallocateObject 7.4.不能在C结构体中使用对象指针 7.5.id与void *间的如果cast时需要用特定的方法(__bridge关键字) 7.6.不能使用NSAutoReleasePool、而需要@autoreleasepool块 7.7.不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)