@FoxBabe
2015-04-07T15:28:06.000000Z
字数 7250
阅读 3273
本文档目的在于定义iOS开发过程中的编码规范,统一编程风格,提高代码的可读性与团队编码效率,避免团队开发可能造成的混乱。
本文档规范使用于团队内使用Objective-C开发的工程项目。

说明:
* Resource存放资源文件,图片、字体和配置文件等;* Macro宏定义目录,存放程序的常用宏定义和第三方参数的宏定义;* Helper常用帮助工具汇总;* Categroy常用类的扩展文件;* NetWork网络框架工具* UI常用公共控件* Depends第三依赖库文件夹* Models模型对象* Views项目中自定义的视图和控件* Controllers项目中的控制器,根据实际业务再进行分组
头文件布局优先顺序,从上到下递减
* .h头文件描述,描述参考注释模块* 引用的头文件* 常量定义和宏定义,如常用的通知、常量和公用宏的定义* 类和协议说明,使用@class和@protocol来说明某个类型为类或协议* 类定义,即定义@interface和其成员变量* 类属性,在@interface外定义类的属性* 类方法和实例方法* 协议定义* 扩展类别
实现文件布局优先顺序,从上到下递减
* .m实现文件描述,描述参考注释模块* 引用的头文件* 常量定义的实现* 内存管理,目前采用ARC编码,这里的内存指在dealloc文件中移除通知,清空特殊数据等,此步可选。* 数据初始化和界面初始化* 详情实现方法,使用#parma mark 的 Detail methods来分组* 其他归类方法的分组* 自定义类的协议实现方法,按照不同的协议分组显示* 系统类的协议实现方法,按照不同的协议分组显示* 扩展类别的实现方法
实现文件中,务必定义初始化方法,变量在使用之前,都必须统一进行初始化赋值;对于设计界面的类,如集成View或ViewControler,需要添加界面初始化的方法。
#!objective-cextern ushort APIDefaultPageSize; // 还行,能明白意思了extern ushort APIDefaultFetchPageSize; // 加上些限定更好一些extern ushort APIFetchPageSizeDefault; // 再好些,把重要的往前放YHToolbarComment // 不推荐YHCommentToolbar // OK,把类型(toolbar)置后
| 缩写 | 含义 |
|---|---|
| btn | 按钮 |
| hlbtn | 按钮的高亮 |
| bg | 背景图片 |
| hlbg | 背景图片的高亮 |
| img | 图片 |
| icon | 图标 |
#!objective-cpersonalcenter_edituserinfo_btn //个人中心编辑用户信息按钮common_save_btn //共用的保存按钮
例如:
#!objective-c// OK- (NSString *)name;// 糟糕,应用上面的写法- (NSString *)getName;// OK,但极少使用- (void)getName:(NSString **)buffer range:(NSRange)inRange;// OK- (NSSize)cellSize;// 糟糕,应用上面的写法- (NSSize)calcCellSize;// 对 controller 做一般设置,OK- (void)setupController;// 列出具体设置的内容,更好- (void)setupControllerObservers;// 糟糕,set 专用于设置属性- (void)setController;
#!objective-cNSApplicationDidBecomeActiveNotificationNSWindowDidMiniaturizeNotificationNSTextViewDidChangeSelectionNotification
#!objective-cUILabel *userNameLabel;UIButton *loginBtn;
#!objective-c#define PI 3.1415926
除以上规则约定外,其他常量约定了以下前缀:
| 前缀 | 含义 |
|---|---|
| k | 宏常量 |
| CDEN | CoreData entity name |
| UDK | User Default Key |
| 缩写 | 含义 |
|---|---|
| URL | 链接地址 |
| x | 坐标 |
| y | 坐标 |
| w | 宽度width |
| h | 高度height |
| vc | 控制器ViewController |
| v | 视图View |
| dic | 字典Dictionary |
#!objective-c- (void)doSomethingWith:(GTMFoo *)theFoo rect:(NSRect)theRectinterval:(float)theInterval {}- (void)short:(GTMFoo *)theFoo longKeyword:(NSRect)theRectevenLongerKeyword:(float)theInterval {}
#!objective-c//OK[myObject doFooWith:arg1 name:arg2 error:arg3];[myObject doFooWith:arg1name:arg2error:arg3];//糟糕[myObject doFooWith:arg1 name:arg2 // some lines with >1 argerror:arg3];[myObject doFooWith:arg1name:arg2 error:arg3];[myObject doFooWith:arg1
#!objective-c// 糟糕-(void)methodName:(NSString *)string;// OK- (void)methodName:(NSString *)string;// 糟糕if ( a < b ) {// something}// OKif (a < b) {// something}// OK(someValue > 100)? YES : NO
#!objective-c- (void)methodName:(NSString *)string {↑空格 ↑空格,推荐花括号在一行if () {空格↑ ↑空格,花括号不要另起一行}else {要换行↑ ↑空格,花括号不要另起一行}}
说明:Xcode 默认的花括号位置是这样的:方法内部的各种补全都是在同一行的;方法定义的比较混乱,默认模版另起一行,但从 Interface Builder 中连线生成的方法在同一行的。考虑到 Xcode 的默认行为,方法内部要另起一行,方法所在行不强制定死。另外,模版可以定制,而 IB 生成的代码不可定制,所以不另起一行的写法优先。另起一行的写法在代码折叠后非常难看。
长表达式(超过100列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
Google的80字符的标准有点少,这导致过于频繁的换行(Objectve-C的代码一般都很长)通过 “Xcode => Preferences => TextEditing => 勾选Show Page Guide / 输入100 => OK” 来设置提醒
函数(方法)声明时,类型与名称不允许分行书写。
#!objective-c//OKextern double FAR CalcArea(double dWidth, double dHeight);//糟糕extern double FARCalcArea(double dWidth, double dHeight);
#!objective-ctypedef enum{SDWebImageRetryFailed = 1 << 0, //无法下载时,列入黑名单中后,将不会再重新下载SDWebImageLowPriority = 1 << 1, //默认情况下,图像下载期间用户界面相互作用开始,这标志禁用此功能,SDWebImageCacheMemoryOnly = 1 << 2, //禁止磁盘缓存SDWebImageProgressiveDownload = 1 << 3 //这个标志使渐进式下载,图像显示逐步在下载期间作为一个浏览器会做的。} SDWebImageOptions;
#!objective-ctypedef NS_ENUM(NSInteger, TTITextAlignment) {TTITextAlignmentLeft = 0, // 左对齐TTITextAlignmentRight = 1, // 右对齐TTITextAlignmentCenter = 2, // 居中}
参考苹果最新的API头文件,推荐采用第二种来进行定义。关于枚举类型的命名和对应只命名作如下约定。
项目中常见block定义方式,如下所示:
#!objective-ctypedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType);typedef void(^SDWebImageDownloaderProgressBlock)(NSUInteger receivedSize, long long expectedSize);
block类型命名规则约定:[类名]+[状态](可选 + [条件描述,如withxxx])+ Block。
使用#import引入Ojbective-C和Ojbective-C++头文件,使用#include引入C和C++头文件。
程序编码过程中,我们可以通过一些标注,来提示自己有些事情是需要以后来处理的,为了防止遗漏,加上TODO、FIXME、!!!、???和waring是很有必要的,我们可以通过下面的方式添加对应的提醒:
#!objective-c// TODO: 处理异常情况// FIXME: 此处需要清楚缓存// !!!: 此处逻辑不严谨,待完善// ???: 这块的实现上还存在难度,待研究跟进#warning 此处在特定情况下会出现异常,提交版本前一定要处理
前四种为备注说明,并且在预览方法时会清晰显示出来,后面warnning,是在编译程序后都会直接作为一个警告出现在编译结果中。
在实际开发中,如果开发到中途,要需要处理的,务必加上对应的标志,防止再次来编辑时遗漏。另外,在提交版本前,一定要对这些标志进行一次检查,warnning能很明显的发现,其他四种可以采用插件Xcode插件XToDo(https://github.com/trawor/XToDo)来查找。
头文件说明示例:
#!objective-c//// TTiRecordStatueBar.h// CustomStatueBar//// Created by Fox on 14-7-16.// Copyright (c) 2014年 翔傲信息科技(上海)有限公司. All rights reserved.
注意:
* 个人创建的类必须修改为当前用户
* 版权同意为:翔傲信息科技(上海)有限公司
1. 方法注释只需要在申请方法的地方添加,实现时不需要添加;
2. 注释使用中文;
本文档编写过程中参考了如下编码规范文档: