iOS软件编程规范

1.  目的
统一XCode编辑环境下Objective-C编程风格和标准,提高代码可读性与编码效率,避免团队开发可能带来混乱。
2.  适用范围
本规范适用于公司所有用Objective-C语言开发的项目。
3.  定义
规则 : 编程时必须遵守的约定
建议 : 编程时需要考虑的约定
正例 : 对此规则或建议给出的正确例子
反例: 对此规则或建议给出的反面例子
4.  基本原则
4.1.    基本要点
首先是为人编写程序,其次才是计算机,这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。
4.2.    保持代码的简明清晰
简单是最美。保持代码的简单化是软件工程化的基本要求。不要过分追求技巧,否则会降低程序的可读性。
4.3.    编程时正确性
编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,最后才考虑程序的效率和资源占用。
4.4.    代码的复用
尽量选择可借用的旧的代码,对其修改优化以达到自身要求。提高代码的复用性。
4.5.    减少错误出现的次数
事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。
4.6.    代码的基本规范约定
1.  .h文件用于声明需要公开的属性和函数接口,应保证.h文件的简洁性,不需要公开的属性和函数不要声明在.h文件。
在.m文件实现声明的函数接口封装,重要函数需添加#pragma mark xxxx标注,方便查找,具体查找如下图

2.  所有类名、公开变量、文件目录名、宏定义名第一个字母必须大写。
3.  所有方法名、成员变量名、属性名、参数名第一个字母必须小写。所有SQL语句关键字必须全部大写,常量名必须全部大写,且单词与单词之间需要使用下划线。
4.  不可将浮点变量用“==”或“!=”与任何数字比较。无论是float还是double类型的变量,都有精度限制。应该转化成“>”或“<”形式来比较。
5.  布局
程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。更重要的是,统一的程序布局和编程风格,有助于提高整个项
目的开发质量,提高开发效率,降低开发成本。同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。因此,统一的、
良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而且会涉及到产品质量,涉及到个人编程能力的提高,必须要引起重视。
5.1.    基本格式
5.1.1.  .h文件布局顺序
源代码.h文件,布局顺序: #import语句、命名空间、公开的属性、成员变量、成员函数或者类函数。
正例:
#import <Foundation/Foundation.h>
@interface CarNumber : NSObject 
{
BMKMapManager* _mapManager;
CGFloat width;
}
@property(nonatomic, assign) NSInteger id;
//最后的处理时间
@property(nonatomic, copy) NSString *dealTime;

-    (void)setDealTime:(NSString *)dealTime;
+ (NSString*)dealTime;
@end

代码每行限字,每行代码最多不得超过80个字符, 如果超出设定自动换行。
说明:包括空格以及",:;"等符号在内不超过80字。在Xcode中设置
,方法: xcode=>preferences=>TextEditing=>Page Guide at 
column / 输入80即可

5.1.2.  #import语句布局顺序
遵循统一的布局顺序来书写#import语句,不同类别的#import语句之间用空行分隔。按系统库、第三库库、自己创建的文件来空行分隔。
正例:
#import <Foundation/Foundation.h>

#import "WXApi.h"
#import "AliPay.h"

#import "CarNumber.h"

5.1.3.  成员变量的声明
声明成员变量时,变量属性的类名前后各空一格,括号内的变量修饰词之间用逗号隔开,在逗号后空一格。
正例:
@property(nonatomic, copy) NSString *dealTime;
反例:
@property(nonatomic,copy)NSString*dealTime;

5.1.4.  保持代码的紧凑
源程序中关系较为紧密的代码应尽可能相邻, 增加代码的可读性。
正例:
-(void)setTitle {
NSString *title = @"E停车";
self.title = title;
[self setButWithTitle:self.title];
}

-(void)setButWithTitle:(NSString*)title {
    self.but.titleLabel.text = title;
}
5.2.    对齐
5.2.1.  函数的对齐
在声明或者调用一个函数时,如果函数过长需多行显示时,需每行按参数名对齐。
正例:
- (void)payOrder:(NSString *)orderStr
       fromScheme:(NSString *)schemeStr
       calledblok:(CompletionBlock)completionBlock;
反例:
- (void)payOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr   
calledback:(CompletionBlock)completionBlock;

5.2.2.  代码的缩进
函数里面的代码按缩进1个Tab键空格对齐。
正例:
-    (void)setTitle {
NSString *title = @"E停车";
self.title = title;
[self setButWithTitle:self.title];
}

5.2.3.  字典与数组的对齐
字典与数组里面的每个元素或者键值对按缩进1个Tab键空格左对齐。元素和键值对之间用逗号隔开。
正例:
NSArray *theStuff = @[
    @"Got some long string objects in here.",
    [AndSomeModelObjects too],
    @"Moar strings"
];

NSDictionary *keyedStuff = @{
    @"this.key": @"corresponds to this value",
    @"otherKey": @"remoteData.payload",
    @"some": @"more",
    @"JSON": @"keys",
    @"and": @"stuff",
};

5.2.4.  block的对齐
block的函数采用左对齐,block里面的代码按一个Tab键空格对齐。
正例:
[UIView animateWithDuration:1.0 animations:^{
      self.view.alpha = 0.5;
} completion:^(BOOL finished) {
    [self.view removeFromSuperview];
}];
反例:
[UIView animateWithDuration:1.0 animations:^{
      self.view.alpha = 0.5;
      } completion:^(BOOL finished) {
    [self.view removeFromSuperview];
      }];

5.3.    空行空格
5.3.1.  函数实现的空行
实现函数时,应在函数名后空一格再加上大括号”{“, 结尾”}”要单独占一行。
正例:
-(void)setTitle {

}
反例:
-(void)setTitle{

}

5.3.2.  函数的声明空格
声明函数时,在标明该函数是类函数还是成员函数的+,-符号后空一格。若函数有多个参数,除第一个参数外,每个参数名前空一格。
正例:
- (void)setTime:(NSString *)time date:(NSDate*)date;
反例:
-(void)setTime:(NSString *)time date:(NSDate*)date;

5.3.3.  函数间的空行
不同逻辑程序块(函数)之间要使用空行分隔。
正例:
-(void)setTitle {

}
//空行
-(void)setButWithTitle:(NSString*)title {

}
5.3.4.  函数返回值的空行
每个有返回值的函数在其执行return语句前要空一行。
正例:
-(NSString*)getTitle {
NSString *title = @"E停车";

Return title;
}

5.3.5.  运算符的空格
多元运算符和它们的操作数之间留一个空格。
正例:
count = sum + h;
count = sum --;
count += 2;

5.3.6.  If等语句的空行空格
if、else、else if、for、while、do等语句后应留一个空格再跟左大括号”{“占一行,结尾”}”要占一行,之后还要在空一行与其他代码分隔开,方便阅读。执行语句不得紧跟其后, 不论执行语句有多少都要加 { }。
正例:
if (width > 10.0) {
    width = 10.0;
}
空行
//其他代码
反例1:
if (width > 10.0)     width = 10.0;
反例2:
if (width > 10.0) {   width = 10.0;}

5.3.7.  宏的空格
声明宏定义在define 后空2个空格,宏名称后面空两个空格。
正例:
#define  ScreenW  [UIScreen mainScreen].bound.size.width
#define  UserName  @"lizf"

5.4.    断行
5.4.1.  函数
每个函数的长度建议不要超过50行,如果超过50行,需要拆分成多个函数来书写。
说明:每个函数只要需要实现一个主体功能。多个主体功能必须拆分成多个函数来书写,避免造成代码混乱,降低可读性。

5.4.2.  长表达式
长表达式(超过120列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
正例:
if (str != nil
&& ![str isEqualToString:@""]
&& [str class] != [NSNull null]) {

}

5.4.3.  成员变量
成员变量声明时,类型与属性名称不允许分行书写。
正例:
@property(nonatomic, copy) NSString *dealTime;
反例:
@property(nonatomic,copy)NSString
*dealTime;

6.  注释
注释有助于理解代码,有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息,而不是代码表面意义的简单重复。
6.1.    注释的方式
注释可以采用/****/和//两种注释符号,单行注释用//,多行注释用/****/。
6.2.    变量或者属性的注释
对于一行代码的注释可放在前一行及本行上,如放于上方则需与其上面的代码用空行隔开不允许放在下一行,更不允许在一行语句的中间加入注释。
正例:
@property(nonatomic, copy) NSString *dealTime; // 时长

// 时长
@property(nonatomic, copy) NSString *dealTime; 
反例:
@property(nonatomic,copy)NSString *dealTime;
//时长

6.3.    类的注释
类的注释添加在文件的最上面,具体按如下规范注释。
正例:
//  ViewController.m(类文件名)
//  NSStringAndNSCharacterset(所属项目名)
//  
//  Created by lx-sh on 16/8/26.(修改者和修改日期)
//  Copyright © 2016年 HuaweiSoft.(证书绑定的公司名)
//

6.4.    函数的注释
对于一个复杂的函数,其注释规范按如下标准,清晰明了。
正例:
/**
*  函数的备注
*  @param order1     参数1
*  @param order2     参数2
*  @return           返回值
*/

7.  iOS中的命名规范
好的命名规则能极大地增加可读性和可维护性。同时,对于一个有上百个人共同完成的大项目来说,统一命名约定也是一项必不可少的内容。
7.1.    文件的命名
命名必须使用英文字母,可一个有意义的英文单词或者组合来进行命名,不能使用中文拼音,建议不要用翻译软件直接对中文成英文使用。大写字母开头,多个单词每个单词首字母大写,采用驼峰式命名法则。

7.2.    命名术语
说明: 软件开发人员应注意软件用户的一些约定术语,不应当随意的创造术语,这会降低软件的易用性。
7.3.    变量命名
一般变量名不得取单个字符(如i、j、k等)作为变量名,局部循环变量除外。
7.4.    类和文件的命名
一般来说类名即文件名,iOS开发不推荐使用类中类,命名采用驼峰式命名法则,以类的类型为后缀。
类型
后缀
示例
ViewController
ViewController
LoginViewController.m
View
View
KeyBoardView.m
Model
Model
CarNumbeModel.m
Tool
Tool
PayTool.m


7.5.    特殊文件的命名
特殊的或有特别意义的文件和类在命名时,可加上由英文字母大写缩写的前缀。如表示公司的前缀,”huawei”即可缩写成”HW”。表示某一组件库,” AFNetworking”即可缩写成”AF”。
正例:
HWLoginViewController.h
AFHttpSender.h

7.6.    类扩展的命名
类扩展的命名按原类名加上要扩展的功能的来命名,存放在项目Category目录下。
正例:
NSString+Encoding.h
NSString+Encoding.m

UILabel+Extension.h
UILabel+Extension.m

7.7.    系统组件缩写规范
组件名称
简写
组件名称
简写
Button
btn
Label
lab
ImageButton
ibtn
TextView
txt
ImageView
img
TextField
tfd
ViewController
vc
NSString
str
ScrollView
sclv
SegmentedControl
seg
TableViewCell
cell
AlertView
alv
TableView
tbv
ActionSheet
act
CollectionView
clv
BarButtonItem
btm
7.8.    

7.8.    资源文件的命名
7.8.1.  布局类资源文件命名规范
¡ñ  具体类布局资源文件,即xib文件,该文件与绑定的类名同名,一个xib文件只允许创建一个类的UI布局,不允许一个xib文件绑定多个类。
正例:
ParkRecordCell.h
ParkRecordCell.m
ParkRecordCell.xib
¡ñ  公共布局资源文件,即storyboard文件,可在该文件创建多个控制器类布局。
正例:
//创建项目系统生成的主界面搭建UI文件
Main.storyboard  
//系统生成的用于加载app启动图的文件
LaunchScreen.storyboard  

说明:多人开发中最好少用storyboard文件,容易产生冲突,而且一旦产生冲突没有有效的解决办法,只能选择删除一个人的stroyboard文件,保留另一个人的stroyboard文件
7.8.2.  图片资源文件命名规范
¡ñ  按苹果手机标准一张图需要三套,分别是x1,x2,x3分辨率存放在Resoure目录。具体按如下规范命名
正例:
record.png   record@2x.png   record@3x.png
¡ñ  如果项目有做横竖屏适配,对应适配横屏下的图片资源文件,按图片的描述加“_horiz”来命名
正例:
sureBut_horiz.png     sureBut_horiz@2x.png
sureBut_horiz@3x.png

¡ñ  具体控件图片的命名,按控件名加下划线加图片描述的方式命名。
正例:
sureBut_pay.png     sureBut_pay@2x.png
sureBut_pay@3x.png

¡ñ  一系列相关的图片命名采用图片描述后面再加上数字下标的方式来命名,如一个scrollView中的一套图,一整套动画组图。
正例:
home_page1.png     home_page2.png
home_page3.png

loading_animation1.png   loading_animation2.png
loading_animation3.png   loading_animation4.png
    
7.8.3.  bundle包文件的命名
bundle包文件的命名,在项目中每一功能模块所需的图片资源文件较多, 可将其用到的图片打包成一个bundle文件,其命名就按这一功能模块来描述,这样有利于模块的封装。
正例:    AlipaySDK.bundle     Refersh.bundle

7.9.    成员变量的声明规范
变量的命名,可使用多个单词,第一个单词首字母小写,后面的单词首字母大写。
正例:
//声明一个字符串,用copy修饰
@property (copy, nonatomic) NSString *str;
//声明一个对象,如果是直接从xib或者storyboard拖过来的,用weak
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
//如果是一个自定义的对象,用strong
@property (strong, nonatomic) BBCustomForm *customForm;
@property (strong, nonatomic) UILabel *nameLabel;
//声明代理以及一般常量,用weak
@property (weak, nonatomic) id<Protocl> delegate;
//声明一个block属性用copy
@property(nonatomic, copy) AddNumberBlock block;

7.10.   函数的命名规范
函数的命名应使用有意义的英文单词组成,最好让人看上去直接能够知道函数是干什么的,以小写字母开头,多个单词组合后面的单词首字母大写,第一参数名要从函数上携带出来,第二个参数名首字母小写,多个单词组合后面的单词首字母大写。
正例:
- (void)setUserName:(NSString*)userName;
+ (NSString*)userName;
- (void)loginWithUserName:(NSString*)userNmae  
                   passWord:(NSString*)password

7.11.   代理协议与block
协议与block的命名,协议的命名与类的命名一样,block的命名与属性一样,实际上block就是把一个函数作为属性参数去传递。
正例:
//代理协议
@protocol UITableViewDelegate <NSObject>

@end

//block
typedef void(^addNumberBlock)(NSString *carNumber);

7.12.   宏
宏的命名首字母大写,驼峰法则,复杂宏的命名按如下规范进行书写。用“\”表示换行。
正例:
#ifdef  DEBUG
#define  CCLog(...)  NSLog(__VA_ARGS__);
#else
#define  CCLOG(...)
#endif

#define JLColor(r, g, b) \
[UIColor colorWithRed:r green:g blue:b alpha:1.0]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • http://mp.weixin.qq.com/s/Thieb7I1pDeMgzppNMK9BQ
    ios_stand阅读 129评论 0 0
  • 基本所有公司的编程规范都有如下的规定 Spaces vs. TabsUse only spaces, and in...
    雨影阅读 1,446评论 0 0
  • 通用的约定 通用约定: 方法 字面值 类 Initializer 和 dealloc init 方法应该是这样的结...
    Easy_VO阅读 283评论 0 1
  • “三世诸佛,依般若波罗蜜多故,得阿耨多罗三藐三菩提”。“三世”指前世、今世、来世,泛指一切佛,而佛就是指“觉悟者”...
    莲连阅读 320评论 0 0
  • 体寒的我特别怕过冬天,好朋友基本没准过,还各种不舒服,不管怎么伺候它都不行。偏偏这一段时间来,心里上的压力很大,睡...
    honey小婷阅读 510评论 0 50