英文原文:Google Objective-C Style Guide
Apple已经为Objective-C编写了一本很好的、被广泛接受的编码指南;Google也为C++写了一本类似的指南。这本Objective-C指南意在成为一个对Apple和Google的一般建议的自然组合。因此,在读这本指南之前,确定你已经度过:
注意:所有在Google C++指南中禁用的在Objective-C++里也一样,除非本文特别指出。 |
这个文档是为了描述用于所有Mac OS X代码中的Objective-C(和Objective-C++)编码指南和实践的。这些指南的很多地方已经进化并在其他项目和团队已经过时。谷歌开发的开源项目符合本指南中的要求。 谷歌已经发布了符合这些准则的,作为Mac项目的谷歌工具箱(以下简称GTM)的一部分的开源代码。意味着要在不同项目共享的代码是一个包含在这个库中很好的候选。 注意:这本指南不是一个Objective-C教程。我们假设读者对这么语言很熟悉。如果你是一个Objective-C初学者或需要复习,请阅读的Objective-C编程语言这本书。 |
命名命名规则对于代码的可维护性是非常重要的。Objective-C的方法命名趋向于超长命名,但这会带来良好的代码阅读感受,就像读散文一样,同时还避免了很多不必要的注释。 在撰写纯粹的Objective-C代码时,我们主要是遵循标准的Objective-C命名规范。这些命名方针可能和C++的命名规范相去甚远。比如,Google的C++规范中推荐在变量名中的单词间使用下划线,而Objective-C的规范推荐使用驼峰命名法,这也是在Objective-C社区中的标准做法。 任何类、目录、方法或者变量的名字都应该将其中的首字母缩略词设为大写。下面是苹果官方使用的大写的首字母缩略词:URL,TIFF和EXIF。 |
然而,在编写Objective-C++代码时,往往并非能完全按照规范来进行。很多项目会使用Objective-C,或是Cocoa,或是C++后端与原生的Cocoa前端通信的方式来实现跨平台的C++ API。这就导致了两种语言规范直接冲突的情况。
我们的解决方法是依据方法/函数具体实现的方式来决定命名。如果你在一个@implementationblock里面,就使用Objective-C的命名规范。如果你在一个C++类里面实现一个方法,就使用C++命名规范。这就避免了在一个函数中实例变量和本地变量的命名规则混合使用的情况,减少了对代码的可阅读性造成的极大损害。 |
文件名▶文件名应该反映其中包含的类实现的名称,按照你项目中的约定且大小写相关。 Objective-C++▶在一个源码文件中, Objective-C++ 遵循你实现的函数/方法的风格。 类名▶类名(类别和协议名称)应为大写,并开始使用大小写混合以区分单词。 分类名称▶分类名称应该以一个2到3个字母的前缀开始,识别分类是项目的一部分,还是打开使用。分类,名称应该结合它扩展的类的名称。 Objective-C 方法名称▶方法名称应该以小写字母开头,混合大小写。每个命名参数也应该以小写字母开头。 变量名▶变量名以小写字母开头,混合大小写以区分单词。实例变量以下划线开头。例如:myLocalVariable,_myInstanceVariable。 |
Cocoa和Objective-C的特性
被申明在头文件的变量必须是私有的 当变量被申明在头文件时,这个变量必须被标记为@private 标识初始化器 要描述或者标识好初始化器 重写初始化器 当你写一个包含init()方法的的子类时,一定要确定重写了父类的初始化器 重写NSObject方法的位置 强连建议将重写NSObject的方法放到@implementation注记的上面 初始化 不要在init方法中把变量初始化为0或者nil,这样做完全是多余的 避免处理new方法 不要尝试调用NSObject类的new()方法,也不要在他的子类中复写这个方法。我们可以利用他的init方法来实例化这些保留对象 保持公有API简单 要保持你的类尽量简单:避免过分渲染APIs.如果有的方法没必要公开,那就不要公开.要利用private去避免把公有头弄得杂乱 #import 和 #include 要引入Objective-C/Object-C++头文件时用#import;要引入C/C++头文件时用#include. 利用跟框架 在独立文件之上应该包含跟框架 创建完了即可销毁释放 当创建一些临时对象时,在创建的那一行销毁并释放比在同一个方法内下创建然后过一会儿销毁更好 释放并保留 对象的业务遵循释放并保持规则 在执行init或者dealloc方法时避免访问器 当init和dealloc方法正在执行时,子类的实例化可能处在一个不稳定的状态,所以在这些方法中的代码尽量避免调用其他访问器 |
自动引用计数(ARC)▶由于项目使用的是Xcode 4.2或更高版本,并将只运行在64位版Mac OS X 10.7 和 iOS 5.0及更高版本中,ARC 是优先的。手动引用计数在支持早期环境中的归零弱指针时将不可用。 需要 ARC 的类应该包含一个预处理指令来防止编译使用手动引用计数。 象 __unsafe _unretained 和 __weak 的所有权限定符应该在变量名的前面。没必要为变量指定 __strong,因为它是默认的。另一方面,属性应该始终指定 strong 关键字而不是依赖于编译器的默认值。 被编译的文件使用 ARC 时需要有预处理指令以防止编译没有 ARC。请参见下方的代码片段以了解详情。 |